INSERTはテーブルに行を挿入するSQL文である。
すべての列に値を指定して行を挿入する。
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;
SQL> INSERT INTO tsuka.dept VALUES (10, 'ACCOUNTING', 'NEW YORK');
1行が作成されました。
SQL> INSERT INTO dept VALUES (20, 'RESEARCH', 'DALLAS');
1行が作成されました。
SQL> INSERT INTO emp (empno, ename) VALUES (1001, 'Charles Dickens');
1行が作成されました。
列の値を指定する。カンマで区切って複数指定することができる。数値や文字列などの固定値、数式及び関数を指定することができる。
DEFAULT
を指定すると、列のデフォルト値になる。
NULL
を指定すると、NULLになる。
INSERT INTO table1 SELECT * FROM table2
問い合わせの結果と固定値を組み合わせることもできる。
INSERT INTO table1 (col1, col2) SELECT 'foo' AS col1, col2 FROM table2
自分のスキーマ内にある表に行を挿入するには、とくに権限は必要ない。
行を挿入する表が自分のスキーマ内にない場合は、挿入する表に対する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;
MySQL、PostgreSQL および Microsoft SQL Server に複数の行を挿入するには、VALUES句に複数の値リストを指定する。
INSERT INTO emp VALUES
(1001, 'Charles Dickens'),
(1002, 'Ernest Hemingway'),
(1003, 'Fyodor Dostoevsky');
行を挿入する列に対して整合性制約が設定されていることがある。この場合、整合性制約に違反する値を挿入しようとすると、エラーが発生する。
行1でエラーが発生しました。:
ORA-02290: チェック制約(XXXX.AGECHECK)に違反しました