mysql:5988
From: KAWAJI Shinya <KAWAJI Shinya <kawaji@xxxxxxxxxx>>
Date: Sun, 25 Aug 2002 01:53:11 +0900
Subject: [mysql 05988] Re: table_b のフィールド a の値が、 table_a のフィールド a にないレコードに関してだけ insert したい。
かわじ、です。 > table_b のaの値が、table_a のaにないレコードに関してだけ、 > table_b のa,c の値をtable_a のa,bにinsertしたいのですが、 > うまい方法はないでしょうか? > > 気持ちとしては、 > INSERT INTO table_a(a,b) select a,c from table_b; > としたいのですが、これだとすでにtable_aにあると > Duplicate entry エラーになってしまいます。 > > table_bのテーブルを一行づつチェックしてtable_aにないか確認して1行づつ > insertしていくしかないんでしょうか? TEMPORARY TABLE を使う方法もあります。 mysql> CREATE TABLE table_a ( -> a char(200) NOT NULL, -> b char(200), -> PRIMARY KEY (a) -> ); Query OK, 0 rows affected (0.00 sec) mysql> CREATE TABLE table_b ( -> a char(200) NOT NULL, -> b char(200), -> c char(200), -> PRIMARY KEY (a) -> ); Query OK, 0 rows affected (0.00 sec) mysql> INSERT table_a VALUES -> ('a1', 'b1'), -> ('a3', 'b3'), -> ('a5', 'b5') -> ; Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> INSERT table_b VALUES -> ('a1', 'b1', 'c1'), -> ('a2', 'b2', 'c2'), -> ('a3', 'b3', 'c3'), -> ('a4', 'b4', 'c4'), -> ('a5', 'b5', 'c5') -> ; Query OK, 5 rows affected (0.00 sec) Records: 5 Duplicates: 0 Warnings: 0 mysql> CREATE TEMPORARY TABLE tmp SELECT table_b.a, table_b.c FROM table_b -> LEFT JOIN table_a USING (a) WHERE table_a.b IS NULL -> ; Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> INSERT table_a SELECT * FROM tmp; Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM table_a; +----+------+ | a | b | +----+------+ | a1 | b1 | | a3 | b3 | | a5 | b5 | | a2 | c2 | | a4 | c4 | +----+------+ 5 rows in set (0.00 sec) -- Shinya Kawaji
5987 2002-08-25 01:06 [takewo.k <office@xxx] table_b のフィールド a の値が、 table_a のフィールド a にないレコードに関してだけ insert したい。 -> 5988 2002-08-25 01:53 ┣[KAWAJI Shinya <kawaj] 5990 2002-08-25 04:45 ┗[東海林 裕 <shojihiro] 5991 2002-08-25 15:21 ┗[<office@xxxxxxxxxx> ]