SQLのinsertの構文や、DBMSごとの一括挿入、カラム名記述の省略についてまとめています。
SQL insertの構文
insertはテーブルにレコードを挿入するSQLです。insertの構文は以下の通りです。
INSERT INTO テーブル名 (カラム名,カラム名…) VALUES(値,値…);
以下は、employees(社員)テーブルに、1レコード挿入する例です。
INSERT `employees`( `emp_no`, `birth_date`, `first_name`, `last_name`, `gender`, `hire_date` ) VALUES ( 1, '1982-01-01', 'Taro', 'Yamada', 'M', '2002-04-01' )
実行するとこうなります。emp_no=1のレコードが挿入されました。
mysql> select * from employees limit 10; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 1 | 1982-01-01 | Taro | Yamada | M | 2002-04-01 | | 10001 | 1953-09-02 | Georgi | Facello | M | 1986-06-26 | | 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 | | 10003 | 1959-12-03 | Parto | Bamford | M | 1986-08-28 | | 10004 | 1954-05-01 | Chirstian | Koblick | M | 1986-12-01 | | 10005 | 1955-01-21 | Kyoichi | Maliniak | M | 1989-09-12 | | 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 | | 10007 | 1957-05-23 | Tzvetan | Zielinski | F | 1989-02-10 | | 10008 | 1958-02-19 | Saniya | Kalloufi | M | 1994-09-15 | | 10009 | 1952-04-19 | Sumant | Peac | F | 1985-02-18 | +--------+------------+------------+-----------+--------+------------+
【関連記事】
▶MySQL Insert サンプルコード集 一文で一括挿入する方法とは?
DBMSごとのinsertの構文
Oracleのinsertの構文
Oracleでのinsert文の例です。
INSERT INTO purchasing.vendors VALUES (9016, 'Secure Systems, Inc.', 'Jane Secret', '454-255-2087', '1111 Encryption Way', 'Hush', 'MD', '00007', 'discount rates are secret');
Oracleでは複数行の同時insertの書式が他のDBMSとは異なります。各行で異なるテーブルにinsert指定ができるんですね。以下は、日曜~土曜までの売上を一括でinsertする例です。
INSERT ALL INTO sales (prod_id, cust_id, time_id, amount) VALUES (product_id, customer_id, weekly_start_date, sales_sun) INTO sales (prod_id, cust_id, time_id, amount) VALUES (product_id, customer_id, weekly_start_date+1, sales_mon) INTO sales (prod_id, cust_id, time_id, amount) VALUES (product_id, customer_id, weekly_start_date+2, sales_tue) INTO sales (prod_id, cust_id, time_id, amount) VALUES (product_id, customer_id, weekly_start_date+3, sales_wed) INTO sales (prod_id, cust_id, time_id, amount) VALUES (product_id, customer_id, weekly_start_date+4, sales_thu) INTO sales (prod_id, cust_id, time_id, amount) VALUES (product_id, customer_id, weekly_start_date+5, sales_fri) INTO sales (prod_id, cust_id, time_id, amount) VALUES (product_id, customer_id, weekly_start_date+6, sales_sat);
また、WHENと組み合わせて条件成立時のみinsertを実行することも可能です。
以下は、注文の合計(order_total)の額によって、insert先のテーブル名を変更するSQLです。
INSERT ALL WHEN order_total <= 100000 THEN INTO small_orders WHEN order_total > 1000000 AND order_total <= 200000 THEN INTO medium_orders WHEN order_total > 200000 THEN INTO large_orders SELECT order_id, order_total, sales_rep_id, customer_id FROM orders;
SQL Serverのinsertの構文
SQL Serverでは、insert文のカラム指定を省略することが可能です。省略した場合、valuesで全てのカラムに対応する値を指定する必要があります。
INSERT INTO Production.UnitMeasure VALUES (N'FT', N'Feet', '20080414');
SQL Serverで複数のレコードを1行でinsertするには以下のように記述します。
INSERT INTO Production.UnitMeasure VALUES (N'FT2', N'Square Feet ', '20080923'), (N'Y', N'Yards', '20080923') , (N'Y3', N'Cubic Yards', '20080923');
SQL Serverでテーブルのカラム列と違う順序で指定するには、以下のように全てのカラム名を記述し、valuesの内容も対応する値を同様の順番で指定します。なお、テーブルの列の順序は、UnitMeasureCode、Name、ModifiedDate です。
INSERT INTO Production.UnitMeasure (Name, UnitMeasureCode,
ModifiedDate)
VALUES (N'Square Yards', N'Y2', GETDATE());
参考)INSERT (Transact-SQL) – SQL Server | Microsoft Docs
MySQLのinsertの構文
MySQLで、複数レコードを同時にinsertするには以下のように記述します。対象テーブルは1つで、挿入するレコードの内容のみ複数指定が可能です。
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
参考)MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.5 INSERT 構文
MySQLでは、ON DUPLICATE KEY UPDATE句を指定すると、insert時にすでに値が存在する場合はupdateを実行することが可能です。重複エラー対策が、簡単に記述できるんですね。
INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1; UPDATE table SET c=c+1 WHERE a=1;
参考)MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.5.3 INSERT … ON DUPLICATE KEY UPDATE 構文
PostgreSQLのinsertの構文
PostgreSQLで、全てデフォルト値の行を挿入するには、以下のように記述します。
INSERT INTO films DEFAULT VALUES;
PostgreSQLの複数行同時insertの構文は以下の通り。指定できるテーブル名は1つで、insert内容のみを複数指定可能です。
INSERT INTO films (code, title, did, date_prod, kind) VALUES ('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'), ('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy');
PostgreSQLの独自拡張RETURNINGは、指定した値をSQLの返り値として返します。以下の例ではdidカラムのデフォルト値を返します。
INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets') RETURNING did;
RETURNINGと、列名リスト省略時に一部の列のみを指定できる点は、PostgreSQLの独自拡張です。
まとめ
- insertは、レコードを挿入するSQL
- DBMSによって、複数レコードを1文で挿入する拡張が用意されている
- DBMSによっては、カラム名の記述は全省略や、一部省略が可能