INSERT テーブルに行を挿入するSQL文

INSERTはテーブルに行を挿入するSQL文である。

INSERTの構文

すべての列に値を指定して行を挿入する。

INSERT INTO [schema.]table VALUES (value [,value...]);

一部の列に値を指定して行を挿入する。指定しなかった列には、デフォルト値が設定されていればデフォルト値となる。デフォルト値が設定されていない列はNULLとなる。

INSERT INTO [schema.]table (column [,column...]) VALUES (value [,value...]);

問い合わせ結果を表に挿入する。

INSERT INTO [schema.]table subquery;
INSERT INTO [schema.]table (column [,column...]) subquery;
schema

行を挿入するテーブルが存在するスキーマ(表の所有者)を指定する。自分のスキーマに存在するテーブル(自分が所有するテーブル)に行を挿入する場合は、スキーマの指定を省略できる。

table

行を挿入するテーブルを指定する。

column

列名。カンマで区切って複数指定することができる。列名を指定した場合、特定の列のみに値を挿入することができる。列名を省略した場合は、表を作成したときに指定した順番で列の値を指定する。

value

列の値を指定する。カンマで区切って複数指定することができる。数値や文字列などの固定値、数式及び関数を指定することができる。

DEFAULTを指定すると、列のデフォルト値になる。

NULLを指定すると、NULLになる。

subquery
問い合わせの結果を表に挿入する
INSERT INTO table1 SELECT * FROM table2

問い合わせの結果と固定値を組み合わせることもできる。

INSERT INTO table1 (col1, col2) SELECT 'foo' AS col1, col2 FROM table2
SQL> INSERT INTO emp values ('0001', '山田太郎');

1行が作成されました。

SQL>

INSERTに必要な権限

自分のスキーマ内にある表に行を挿入するには、とくに権限は必要ない。

行を挿入する表が自分のスキーマ内にない場合は、挿入する表に対するINSERTオブジェクト権限が必要である。

複数の行を挿入する

Oracleデータベースに複数の行を挿入するには、SELECT INTOの形式で複数のINTO句とVALUE句を指定する。挿入する行の元表は無いので、DUAL表を指定する。

INSERT ALL
  INTO emp VALUES (1001, 'Charles Dickens')
  INTO emp VALUES (1002, 'Ernest Hemingway')
  INTO emp VALUES (1003, 'Fyodor Dostoevsky')
  SELECT * FROM DUAL;

複数のテーブルに複数の行を挿入することもできる。

INSERT ALL
  INTO deptno VALUES (10, 'accounting')
  INTO deptno VALUES (20, 'research')
  INTO deptno VALUES (30, 'sales')
  INTO emp (empno, ename, deptno) VALUES (1001, 'Charles Dickens', 10)
  INTO emp (empno, ename, deptno) VALUES (1002, 'Ernest Hemingway', 20)
  INTO emp (empno, ename, deptno) VALUES (1003, 'Fyodor Dostoevsky', 30)
  SELECT * FROM DUAL;

MySQLPostgreSQL および Microsoft SQL Server に複数の行を挿入するには、VALUES句に複数の値リストを指定する。

INSERT INTO emp VALUES
  (1001, 'Charles Dickens'),
  (1002, 'Ernest Hemingway'),
  (1003, 'Fyodor Dostoevsky');

関連SQL

COMMIT
トランザクションをコミットする。
DELETE
テーブル等からレコードを削除する。
ROLLBACK
トランザクションをロールバックする。
SELECT
テーブル等からレコードを問い合わせる。
UPDATE
テーブルのレコードを更新する。