2011-12-14 26 views
1

mysqlのどこに行があるのか​​をUPDATEしてINSERTすることはできますか?私はこのクエリ、mysqlでUPDATEとINSERTを行うことは可能ですか?

$q = $dbc -> prepare("UPDATE accounts SET lifeforce = maxLifeforce, inHospital = 0 WHERE hospitalTime <= NOW() AND inHospital = 1"); 
$q -> execute(); 

がどのように私は、配列内の各アイテムの挿入を行うための連想配列に主キーを取得し、またはUPDATEを行うと、挿入することができますいずれかがありますか?

または、一致条件をすべて取得するためにSELECTを実行した後、選択から配列を使用してUPDATEおよびINSERTを実行しますか?これはむしろ長い道のりをしているようですね。

基本的に、更新される同じ主キーを使用して別のテーブルにINSERTする必要があります。

+1

それは私かもしれないが、私は何見当もつかない平均。あなたはexcisting行を更新したいのですが、挿入したくない場合は?または、他の何か?前者は「置き換え」、後者は説明が必要です:) – Nanne

+0

いいえ、主キーを使用して更新された同じ行の別の表に挿入する必要があります。 – cgwebprojects

+0

これは、あなたのデータベーススキームが、そのような関係があるとあまり意味を持たないことを意味するかもしれませんが、それはちょっと推測され、おそらく私の前触れです。 :D – Nanne

答えて

3

または、一致条件をすべて取得するためにSELECTを実行し、次に選択から配列を使用してINSERTを更新しますか?

はい、申し訳ありませんが、それは主な方法です。

もう1つの方法は、(たとえば)last_updatedと呼ばれる列を追加して、列を更新するたびに設定する方法です。挿入を駆動するクエリでその列を使用できます。それは他の利点を持っています—多くのもののためにlast_updatedの列が有用であることがわかります—しかし、これがあなたがこれを使用する唯一のものならば、それは残酷です。


編集追加する:ちょうど私に起こった別のオプションは、あなたが必要な挿入を実行することを、あなたのaccountsテーブルにadd a triggerにあります。それは質的に異なっている—アプリケーションロジック—の問題ではなく、挿入がaccountsのプロパティになりますが、それはおそらくあなたが望むものですか? 「データベースのようなアプリケーションロジックの制約を完全には受けない」キャンプの最も極端な陣営でさえ、通常はトリガーについて慎重である。—彼らは本当にアプリケーションを実装するための良い方法ではない誰もそれを探すとは思わないどこかのロジックを隠しているからです。しかし、挿入しようとしているテーブルがaccount_historyテーブルのようなものであれば、すべての変更をaccountに記録しておくことができます。

+0

ありがとう、私は手動で行う必要がありますね! – cgwebprojects

+0

@cgwebprojects:どうぞよろしく!また、別のオプションがちょうど私に起こった。私はそれを記述するために私の答えを編集しました。私はそれを示唆するのはちょっと気にしません。なぜなら、それは悪い考えである可能性が高いからです。一方では、あなたの挿入物のセマンティクスに応じて、行うべき正しいことかもしれません。 – ruakh

+0

これは私が感謝のために探していたものです。 – cgwebprojects

0

マニュアルに書かれたあなたは、複数のテーブル更新を使用することができます。http://dev.mysql.com/doc/refman/5.0/en/update.html

を第二のテーブルには、挿入を必要とする場合、あなたはおそらくそれを手動で行う必要があります。そのような連続したクエリを実行しているとき、私はトランザクションを使用してお勧めしたい、また http://php.net/manual/en/mysqli.insert-id.php

関連する問題