MYSQL挿入処理を繰り返すキーの数種類の方法


まずテスト表を2つ作成して、id列にunique制約を作成します。mysql>create table test 1(id int,name varhar(5)、type int,primy key(id));Query OK、0 rows affected(0.01 sec)mysql>create table test 2(id int、name varhar(5)、typeint、prmary key(id));Query OK、0 rows affected(0.01 sec)mysql>select*from test 1、+--------------++|id。  | name|type+-----------------------------------124; 101𞓜aa  |    1𞓜102𞓜bb  |    2𞓜103𞓜cc  |    3|+------------------3ローws in set(0.00 sec)mysql>select*from test 2;+-----------------------------------------------|id。  | name|type+------------------------201𞓜aa  |    1𞓜202𞓜bb  |    2|𞓜203_cc  |    3𞓜101|xxx  |    5_;+--------------+4 rows in set(0.00 sec)1、REPLACE INTOは重複した先に削除して挿入することを発見しました。もし複数のフィールドが記録されていたら、挿入する時にあるフィールドが割り当てられていない場合、新たに挿入された記録はこれらのフィールドが空です。mysql>replace into test 1(id,name)(select id,name from test 2);Query OK、5 rows affected(0.04 sec)Records:4  Duple cates:1  Warnings:0 mysql>select*from test 1;+----------------+++|id。  | name|type+---------------------------------------101|xxx  | NULL 124 b  |    2𞓜103𞓜cc  |    3𞓜201𞓜aa  | NULL 124 202𞓜bb  | NULL𞓜203𞓜cc  | NULL+---------------6 rows in set(0.00 sec)は、replaceの場合、挿入されたテーブルが指定されていない場合は、この表の元の内容ではなくNULLで表示されます。挿入されたコンテンツ列と挿入されたテーブル列が同じであれば、NULLは発生しません。例えばmysql>replace into test 1(id,name,type)(select id,name,type from test 2);Query OK、8 rows affected(0.04 sec)Records:4  Dupliccates:4  Warnings:0 mysql>select*from test 1;+----------------+++|id。  | name|type+---------------------------------------101|xxx  |    5𞓜102𞓜bb  |    2𞓜103𞓜cc  |    3𞓜201𞓜aa  |    1𞓜202𞓜bb  |    2|𞓜203_cc  |    3_;+------------+6 rows in set(0.00 sec)INSERTの場合は、挿入されたテーブルの列を保持し、指定された列だけを更新する必要があります。2、INSERT INTO ON DUPLICATE KEY UDATEは更新操作を繰り返すことを発見しました。既存のレコードに基づいて、指定されたフィールドの内容を更新し、他のフィールドの内容を保持します。例えば、test 2表のid、nameフィールドだけを挿入したいですが、test 1表のtypeフィールド:mysql>insert into test 1(id、name、type)(select id、name、type from test 2)on DUPLICATE KEY DATE test 1.name=testname 2;Query OK、5 rows affected(0.04 sec)Records:4  Duple cates:1  Warnings:0 mysql>select*from test 1;+----------------+++|id。  | name|type+---------------------------------------101|xxx  |    1𞓜102𞓜bb  |    2𞓜103𞓜cc  |    3|𞓜203_cc  |    3𞓜202𞓜bb  |    2𞓜201𞓜aa  |    1_;+------------------6 rows in set(0.00 sec)INSERTの場合、元のテーブルにないデータだけを挿入する場合、第3の方法が使用されます。3、IGNORE INTOは、存在するかどうかを判断し、挿入しないかを判断し、挿入します。簡単に理解できます。挿入するとき、一意の制約に違反して、MySQLはこの文を実行しようとしません。例えば、mysql>insert ignore into test 1(id,name,type)(select id,name,type from test 2);Query OK、3 rows affected(0.01 sec)Records:4  Duple cates:1  Warnings:0 mysql>select*from test 1;+----------------+++|id。  | name|type+-----------------------------------124; 101𞓜aa  |    1𞓜102𞓜bb  |    2𞓜103𞓜cc  |    3|𞓜203_cc  |    3𞓜202𞓜bb  |    2𞓜201𞓜aa  |    1_;+------------+6ローソンin set(0.00 sec)