MySQLバッチ挿入ユニークインデックス回避方法(重複データのインポートを回避)
2857 ワード
MySQLバッチ挿入ユニークインデックス回避方法(重複データのインポートを回避)
重複データのインポートは回避されていません.一意のインデックスを作成して一括挿入を防止することを推奨します.一意のインデックスに遭遇した場合は、次の3つの方法で回避できます.(一)差分データをインポートし、重複データを無視し、IGNORE INTOの使用 (二)重複データのインポートと上書き、REPLACE INTOの使用 (三)重複データ保持未指定フィールドのインポート、INSERT INTO ON DUPLICATE KEY UPDATEの使用 .
表test 1
id
user_id
user_name
user_type
1
101
101
1
2
102
102
2
3
103
103
3
表test 2
id
user_id
user_name
user_type
1
201
201
1
2
202
202
2
3
203
203
3
4
101
204
4
(一)第一の方式で導入し、IGNORE INTOの使用:
表test 1の結果は以下の通りである
id
user_id
user_name
user_type
1
101
101
1
2
102
102
2
3
103
103
3
4
201
201
1
5
202
202
2
6
203
203
3
表2のid=4のレコードは無視され,インポートされない.
(二)第二の方式で導入し、REPLACE INTOの使用
表test 1の結果は以下の通りである
id
user_id
user_name
user_type
2
102
102
2
3
103
103
3
4
201
201
1
5
202
202
2
6
203
203
3
7
101
204
4
上の図から、user_id=101のデータが変化した.インポートで重複が見つかった場合は、削除してから挿入します.
インポート時にカラムが指定されていない場合、指定されていないカラムのデータは(Null)に置き換えられます.
表test 1の結果は以下の通りである
id
user_id
user_name
user_type
2
102
102
2
3
103
103
3
4
201
201
(Null)
5
202
202
(Null)
6
203
203
(Null)
7
101
204
(Null)
(三)第三の方式で導入し、INSERT INTO ON DUPLICATE KEY UPDATEの使用
表test 1の結果は以下の通りである
id
user_id
user_name
user_type
1
101
204
1
2
102
102
2
3
103
103
3
4
201
201
1
5
202
202
2
6
203
203
3
上の図のようにuser_のみid=101のuser_nameは変わりましたがtest 1テーブルのuser_を保持しますtypeフィールド.複数のフィールドを更新し、後から追加すればよい.
重複データのインポートは回避されていません.一意のインデックスを作成して一括挿入を防止することを推奨します.一意のインデックスに遭遇した場合は、次の3つの方法で回避できます.
表test 1
id
user_id
user_name
user_type
1
101
101
1
2
102
102
2
3
103
103
3
表test 2
id
user_id
user_name
user_type
1
201
201
1
2
202
202
2
3
203
203
3
4
101
204
4
(一)第一の方式で導入し、IGNORE INTOの使用:
INSERT IGNORE INTO test1(user_id,user_name,user_type)
SELECT user_id,user_name,user_type FROM test2;
表test 1の結果は以下の通りである
id
user_id
user_name
user_type
1
101
101
1
2
102
102
2
3
103
103
3
4
201
201
1
5
202
202
2
6
203
203
3
表2のid=4のレコードは無視され,インポートされない.
(二)第二の方式で導入し、REPLACE INTOの使用
REPLACE INTO test1(user_id,user_name,user_type)
SELECT user_id,user_name,user_type FROM test2;
表test 1の結果は以下の通りである
id
user_id
user_name
user_type
2
102
102
2
3
103
103
3
4
201
201
1
5
202
202
2
6
203
203
3
7
101
204
4
上の図から、user_id=101のデータが変化した.インポートで重複が見つかった場合は、削除してから挿入します.
インポート時にカラムが指定されていない場合、指定されていないカラムのデータは(Null)に置き換えられます.
REPLACE INTO test1(user_id,user_name)
SELECT user_id,user_name FROM test2;
表test 1の結果は以下の通りである
id
user_id
user_name
user_type
2
102
102
2
3
103
103
3
4
201
201
(Null)
5
202
202
(Null)
6
203
203
(Null)
7
101
204
(Null)
(三)第三の方式で導入し、INSERT INTO ON DUPLICATE KEY UPDATEの使用
INSERT INTO test1(user_id,user_name,user_type)
SELECT user_id,user_name,user_type FROM test2
ON DUPLICATE KEY UPDATE
test1.user_name = test2.user_name;
表test 1の結果は以下の通りである
id
user_id
user_name
user_type
1
101
204
1
2
102
102
2
3
103
103
3
4
201
201
1
5
202
202
2
6
203
203
3
上の図のようにuser_のみid=101のuser_nameは変わりましたがtest 1テーブルのuser_を保持しますtypeフィールド.複数のフィールドを更新し、後から追加すればよい.
INSERT INTO test1(user_id,user_name,user_type)
SELECT user_id,user_name,user_type FROM test2
ON DUPLICATE KEY UPDATE
test1.user_name = test2.user_name,
test1.user_type = test2.user_type;