他のテーブルのデータを追加
他のテーブルのデータを新しいテーブルに追加する方法を確認します。次の書式を使います。 テーブルの中のカラムにプライマリーキー制約やユニーク制約が設定されている場合に、データを追加すると制約違反となる場合があります。このような場合通常はエラーとなりますが、エラーを発生させる代わりに既存のデータを指定の値で上書きすることができます。
次の書式を使います。
INSERT INTO tbl_name (col_name1, col_name2, ...) SELECT ...;
取得したいデータをSELECT文を使って記述します。このSELECT文で指定するカラム数は、追加するテーブルで値を格納するカラム数に一致していなければなりません。
サンプル
では実際に試してみます。次のようなテーブルを作成しました。
mysql> create table sales(name varchar(20) unique, count int);
また元になるテーブルとして次の2つのテーブルを作成します。
mysql> create table tokyo_sales(name varchar(20), count int, d date);
mysql> create table osaka_sales(name varchar(20), count int, d date);
この2つの元となるテーブルには次のようにデータが格納されています。
それでは「tokyo_sales」テーブルからデータを取得し「sales」テーブルに追加してみます。次のように入力して下さい。
mysql> insert into sales select name, count from tokyo_sales;
データが追加されました。ではデータを取得して確認してみます。
「tokyo_sales」テーブルに含まれていたデータが「sales」テーブルに追加されているのが確認できました。
IGNORE
「tokyo_sales」テーブルと同じように「osaka_sales」テーブルからデータを追加しようとするとエラーが発生します。これはデータを追加する「sales」テーブルの「name」カラムにユニーク制約が設定してあるためで、「osaka_sales」テーブルからデータを追加しようとすると重複が発生するためです。
エラーが発生した場合、データの追加は行われません。
このような場合にエラーを発生させないためにはINSERT文に「IGNORE」を指定します。(IGNOREについての詳細は「ユニーク制約などの違反時にもエラーを発生させずに終了」を参照して下さい)。
それでは試してみます。次のように入力して下さい。
mysql> insert ignore into sales select name, count from osaka_sales;
他のテーブルからデータを取得して追加する場合、ユニーク制約に違反しているデータは追加されませんがそれ以外のデータは追加が行われます。よって今回は2つのデータが追加されました。
ON DUPLICATE KEY UPDATE
また、ユニーク制約などに違反した場合、エラーとするかわりに既存のデータを更新することもできます。これにはON DUPLICATE KEY UPDATE句を使用します。(ON DUPLICATE KEY UPDATE句についての詳細は「ユニーク制約などの違反時に指定の値で上書きする」を参照して下さい)。
それでは試してみます。実行する前に一度「sales」テーブルのデータを全て削除し、その後で「tokyo_sales」テーブルのデータを追加した状態に戻してあります。
続いて次のように入力して「osaka_sales」テーブルのデータを追加して下さい。
mysql> insert into sales select name, count from osaka_sales -> on duplicate key update count=sales.count+values(count);
今回のINSERT文では、ユニーク制約などに違反しないデータはそのまま追加します。そしてユニーク制約などに違反するデータについては、「count」カラムに格納されていた値に追加しようとしたデータの「count」カラムの値を加算した値で「count」カラムの値を更新します。
データを取得してみると次のように表示されます。
追加しようとしたデータの中で「name」カラムの値が'Orange'のデータはユニーク制約に違反するため追加はできませんので、そのデータの「count」カラムの値を「sales」テーブルに既にあった「name」カラムの値が'Orange'のデータの「count」カラムの値に加算だけを行っています。よって「name」カラムの値が'Orange'のデータの「count」カラムの値は 12+4+7=21 となっています。
( Written by Tatsuo Ikura )