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;
行を挿入するテーブルが存在するスキーマ(表の所有者)を指定する。自分のスキーマに存在するテーブル(自分が所有するテーブル)に行を挿入する場合は、スキーマの指定を省略できる。
行を挿入するテーブルを指定する。
列名。カンマで区切って複数指定することができる。列名を指定した場合、特定の列のみに値を挿入することができる。列名を省略した場合は、表を作成したときに指定した順番で列の値を指定する。
列の値を指定する。カンマで区切って複数指定することができる。数値や文字列などの固定値、数式及び関数を指定することができる。
DEFAULT
を指定すると、列のデフォルト値になる。
NULL
を指定すると、NULLになる。
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オブジェクト権限が必要である。
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)に違反しました