11

私の問題は、テーブルに複数の一意のキーがあることです。

  1. Insert ignore は、エラーを抑制するため、オプションではありません。
  2. MySQL は、ステートメントの外側の条件のタイプをサポートしていません (例: if (cond) then insert else don't insert)
  3. ストアド プロシージャはオプションではありません (if/else ステートメントを使用できる唯一の場所)
  4. 重複キーでは、キーが新しい値で更新される可能性がありますが、一意の制約に失敗した場合に備えて一意のキーを変更しないでください。

したがって、唯一のオプションは重複するだけで、何も更新しないでください。これを達成する方法はありますか?または、他のオプションはありますか?

4

2 に答える 2

21

実際には何もしたくない場合はON DUPLICATE KEY UPDATE、列の値を既存の値に設定するだけです。キーワードを使用する場合とは異なり、外部キー制約などの他の競合は発生しIGNOREますが、競合時に値が変更されることはありません。

INSERT INTO table (value1, value2) VALUES ('1', '2')
ON DUPLICATE KEY UPDATE value1 = value1;

競合が発生した場合に有効なデータが変更されないようにする場合は、任意のデータを含む列をテーブルに追加し、それをUPDATEステートメントに使用できます。

データベースではなくアプリケーションにすべてのロジックを保持する場合の3番目のオプションは、ステートメントを実行するSELECT前に、最初にステートメントを実行して潜在的な競合を検査するINSERT/UDPATEことです。

シナリオでは除外されていますが、ストアドプロシージャは、単一のデータベース呼び出しでこのロジックを提供することもできます。

于 2012-10-23T23:55:12.160 に答える
-2

誰かがこの問題に出くわした場合に備えて、別のオプションを見つけました。

テーブルに自動インクリメントされた主キーがある場合、次のように pk を更新できます。

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;
于 2012-10-24T00:53:17.543 に答える