SQLの基本であるINSERTの説明は多くのサイトで書かれているが、MySQLでは2つの書き方ができる点や、複数行の挿入ができる点、SELECTの結果を挿入できる点などにも触れているサイトは少ない。


基本的な挿入方法

まずは、よく見る基本的な挿入の方法。

INSERT INTO <テーブル名> (<カラム名1>, <カラム名2>, ...) VALUES(<データ1>, <データ2>, ...);
INSERT INTO sample (id, name) VALUES(1, '太郎');
INSERT INTO sample (id, title, content) VALUES(2, 'レコードを挿入する', 'SQLの基本で・・・・');
INSERT acc (url, referer) VALUES('http://xxxxxxxxx/', 'http://yyyyyyyyyyyyyyy/');

MySQLではINTOが省略できるが、PostgreSQLではできないので、互換性を考えて省略しない方が良い。

テーブルの持つ全てのカラムに順番通りにデータを挿入するのなら、カラム名リストを省略して、以下のように書くこともできる。

INSERT INTO <テーブル名> VALUES(<データ1>, <データ2>, ...);
INSERT INTO sample VALUES(1, '太郎');
INSERT INTO sample VALUES(2, 'レコードを挿入する', 'SQLの基本で・・・・');
INSERT acc VALUES('http://xxxxxxxxx/', 'http://yyyyyyyyyyyyyyy/');

カラム名リストを省略した場合は、カラムを追加したときにSQLを書き換える必要があることに注意。

デフォルト値を挿入したい場合には以下のようにDEFAULTと書くことでデフォルト値を与えることができる。

INSERT INTO sample VALUES(DEFAULT, '太郎');
INSERT INTO test VALUES(DEFAULT, 'レコードを挿入する', DEFAULT);
複数レコードの挿入方法

以下のように書くことで複数のレコードを同時に挿入できる。

INSERT INTO <テーブル名> (<カラム名1>, <カラム名2>, ...) VALUES(<データ1-1>, <データ1-2>, ...), (<データ2-1>, <データ2-2>, ...), ...;
INSERT INTO sample (id, name) VALUES(1, '太郎'), (2, '次郎'), (3, '三郎');
INSERT sample VALUES(4, '四郎'), (5, '五郎'), (6, '六郎');

複数の場合でも同様にINTOやカラム名リストは省略できる。

UPDATE文のように書く挿入方法

方法1のような書き方以外に、UPDATE文のような書き方をすることもできる。

INSERT <テーブル名> SET <カラム名1> = <データ1>, <カラム名2> = <データ2>, ....;
INSERT test SET user = 'トム', score = 82;
INSERT book SET id = 21983, title = '売れない本のススメ', price = 2500;

この書き方では、同時に複数のレコードを挿入することはできない。 また、PostgreSQLではこのような書き方ができないため、互換性を考えてこの書き方はあまりしない方が良い。

SELECTの結果を挿入する方法

別のテーブルからデータを挿入したいという場合には、以下のように書くことで別のテーブルから挿入できる。

INSERT INTO <テーブル名> (<カラム名1>, <カラム名2>, ...) <SELECT文>
INSERT INTO sample (id, name) SELECT test.id, test.user FROM test;
INSERT INTO sample (name) SELECT book.title FROM book WHERE price > 2000;
INSERT referer SELECT acc.referer FROM acc WHERE time > '2007/12/01';

この場合でも、同じようにINTOやカラム名リストを省略することができる。