0

これはいくつかのサンプルデータを含む私のテーブルです

C ID | D ID    | Details |
--------------------------
 a   | b_data1 | d1      |
 a   | b_data2 | d2      |
 b   | b_data1 | d1      |
 b   | b_data2 | d2      |
 c   | b_data1 | d1      |
 c   | b_data2 | d2      |

このクエリを実行すると##

INSERT IGNORE INTO table_name (C_ID, D_ID, Details) VALUES ('C', 'b_data3','d3') ('C', 'b_data2','d2')

2番目の値のペアを無視することになっているときに、これらの両方の行を挿入します('C', 'b_data2','d2')

インデックス/主キーは定義されていません。

重複する行がないことを確認したいのですが、3つの列のデータを組み合わせると、行が一意になるはずです。一意にすることはできません。ここで説明したように、aはbと同じコンテンツを保持できますが、aは重複してはなりません。

4

3 に答える 3

2

INSERT IGNORE「クエリに失敗するのではなく、一意の制約を破る行を無視する」ことを意味します。UNIQUE期待どおりに機能するように列を定義する必要があります—例:CREATE TABLE tablename (col1 type, col2 type, col3 type, UNIQUE (col1, col2, col3))

于 2012-05-27T16:26:51.760 に答える
1

MySQLは、UNIQUEインデックスを使用して一意の制約を適用します。テーブルを再作成せずにインデックスを追加する場合は、次のようにします。

CREATE UNIQUE INDEX index_name ON table (C_ID, D_ID, Details)

INSERT IGNOREと前述のREPLACEに加えて、INSERT ... ON DUPLICATE KEY UPDATEを使用して、挿入が重複する一意に実行されたときに何が発生するかをより細かく制御することもできます。

于 2012-05-27T16:38:50.133 に答える
0

@lanzzが提案するように、合成された一意のインデックスを定義する必要があります。インデックスが衝突した場合に新しいレコードを古いレコードに置き換える場合は、replaceステートメントを使用します。

于 2012-05-27T16:33:38.733 に答える