INSERT
このステートメントにより、1 つのテーブルに列の値を挿入します。
構文
INSERT INTO テーブル名
[(列名[, 列名]...)] 挿入値
[ON DUPLICATE KEY UPDATE 列名 = <NULL | DEFAULT | 式 | サブクエリ式[, 列名 = ...]>
[ORDER BY order-by式[, order-by式]...]
テーブル名 ::= ユーザー定義名
列名 ::= ユーザー定義名
挿入値 ::= values句 | クエリ スペック
values句 ::= VALUES (式[, 式]...) | DEFAULT VALUES
式 ::= 式 - 式 | 式 + 式
サブクエリ式 ::= (クエリ スペック) [ORDER BY order-by式
[, order-by式]...] [limit句]
クエリ スペック ::= (クエリ スペック)
FROM テーブル参照[, テーブル参照]...
[WHERE 検索条件]
order-by式 ::=
式 [
CASE(文字列) |
COLLATE 照合順序名] [
ASC |
DESC]
備考
INSERT ステートメントは、DELETE および UPDATE と同様にアトミックな方法で動作します。つまり、複数の行の挿入に失敗した場合、同じステートメントによって実行された前の行の挿入がすべてロール バックされます。
INSERT ON DUPLICATE KEY UPDATE
PSQL v13 R2 では、INSERT ON DUPLICATE KEY UPDATE により、INSERT が拡張されました。この挿入機能は、一意のキーについて、挿入または更新される値と、対象テーブル内の値を自動的に比較します。重複する主キーまたはインデックス キーのいずれかが見つかった場合は、それらの行の値が更新されます。重複する主キーもインデックス キーも見つからなかった場合は、新しい行が挿入されます。一般的な専門用語では、この動作は「upsert」と呼ばれます。
INSERT では、値リストまたは SELECT クエリのいずれかを使用できます。すべての INSERT コマンドと同様に、この動作はアトミックです。
リテラル文字列の最大長より長いデータの挿入
PSQL でサポートされるリテラル文字列の最大長は 15,000 バイトです。これよりも長いデータを処理するには、直接の SQL ステートメントを使用し、挿入を複数の呼び出しに分割します。次のようなステートメントで開始します。
INSERT INTO table1 SET longfield = '15000 バイトのテキスト' WHERE 制限
次に、それ以上のデータを追加する次のステートメントを発行します。
INSERT INTO table1 SET longfield = notefield + '15000 バイトを超えたテキスト' WHERE 制限
例
INSERT の例
このトピックでは、単純な INSERT の例を示します。重複する一意キーを用いて、挿入ではなく更新する場合については、
INSERT ON DUPLICATE KEY UPDATE の例を参照してください。
次のステートメントでは、VALUES 句で式を使ってテーブルにデータを追加しています。
CREATE TABLE t1 (c1 INT, c2 CHAR(20))
INSERT INTO t1 VALUES ((78 + 12)/3, 'This is' + CHAR(32) + 'a string')
SELECT * FROM t1
c1 c2
---------- ----------------
30 This is a string
============
次のステートメントでは、3 つの VALUES 句を使用して、Course テーブルにデータを直接追加しています。
INSERT INTO Course(Name, Description, Credit_Hours, Dept_Name)
VALUES ('CHE 308', 'Organic Chemistry II', 4, 'Chemistry')
INSERT INTO Course(Name, Description, Credit_Hours, Dept_Name)
VALUES ('ENG 409', 'Creative Writing II', 3, 'English')
INSERT INTO Course(Name, Description, Credit_Hours, Dept_Name)
VALUES ('MAT 307', 'Probability II', 4, 'Mathematics')
============
以下の INSERT ステートメントでは、SELECT 句を使用して、授業を受けた学生の ID 番号が Student テーブルから取り出されます。
次に、その ID 番号が Billing テーブルに挿入されます。
INSERT INTO Billing (Student_ID)
SELECT ID FROM Student WHERE Cumulative_Hours > 0
============
次の例は、CURTIME()、CURDATE()、NOW() の各変数を使用して、現在の現地時刻、日付、タイムスタンプの値を INSERT ステートメントに挿入する方法を示します。
CREATE TABLE Timetbl (c1 time, c2 date, c3 timestamp)
INSERT INTO Timetbl(c1, c2, c3) values(CURTIME(), CURDATE(), NOW())
============
次の例は、INSERT および UPDATE ステートメントでのデフォルト値の基本的な使い方を示します。
CREATE TABLE t1 (c1 INT DEFAULT 10, c2 CHAR(10) DEFAULT 'abc')
INSERT INTO t1 DEFAULT VALUES
INSERT INTO t1 (c2) VALUES (DEFAULT)
INSERT INTO t1 VALUES (100, DEFAULT)
INSERT INTO t1 VALUES (DEFAULT, 'bcd')
INSERT INTO t1 VALUES (DEFAULT, DEFAULT)
SELECT * FROM t1
c1 c2
---------- ----------
10 abc
10 abc
100 abc
10 bcd
10 abc
UPDATE t1 SET c1 = DEFAULT WHERE c1 = 100
UPDATE t1 SET c2 = DEFAULT WHERE c2 = 'bcd'
UPDATE t1 SET c1 = DEFAULT, c2 = DEFAULT
SELECT * FROM t1
c1 c2
---------- ----------
10 abc
10 abc
10 abc
10 abc
10 abc
============
直前に記した CREATE TABLE ステートメントを基にした場合、次の 2 つの INSERT ステートメントはまったく同じです。
INSERT INTO t1 (c1,c2) VALUES (20,DEFAULT)
INSERT INTO t1 (c1) VALUES (20)
============
次の SQL コードは、複数の UPDATE 値での DEFAULT の使い方を示します。
CREATE TABLE t2 (c1 INT DEFAULT 10,
c2 INT DEFAULT 20 NOT NULL,
c3 INT DEFAULT 100 NOT NULL)
INSERT INTO t2 VALUES (1, 1, 1)
INSERT INTO t2 VALUES (2, 2, 2)
SELECT * FROM t2
c1 c2 c3
---------- ---------- ----------
1 1 1
2 2 2
UPDATE t2 SET c1 = DEFAULT, c2 = DEFAULT, c3 = DEFAULT
WHERE c2 = 2
SELECT * FROM t2
c1 c2 c3
---------- ---------- ----------
1 1 1
10 20 100
INSERT ON DUPLICATE KEY UPDATE の例
このトピックでは、INSERT ON DUPLICATE KEY UPDATE の例を示します。単純な INSERT については、
INSERT の例を参照してください。
わかりやすくするために、以下の例のクエリ結果では、挿入された値を黒色で、更新された値を赤色で示しています。各例は前の例に基づいて進めているため、順番に実行していくと動作を確認できます。
============
VALUES 句があり、列リストがない INSERT INTO。一意のインデックス セグメント列の値を使用できます。
CREATE TABLE t1 (
a INT NOT NULL DEFAULT 10,
b INT,
c INT NOT NULL,
d INT DEFAULT 20,
e INT NOT NULL DEFAULT 1,
f INT NOT NULL DEFAULT 2,
g INT,
h INT,
PRIMARY KEY(e, f) );
CREATE UNIQUE INDEX t1_ab ON t1 ( a, b, c, d );
INSERT INTO t1 VALUES ( 1, 2, 3, 4, 5, 6, 7, 8 )
ON DUPLICATE KEY UPDATE t1.a = 10, t1.b = 20, t1.c = 30, t1.d = 40;
SELECT * FROM t1;
a b c d e f g h
======== ======== ======== ======== ======== ======== ======== ========
1 2 3 4 5 6 7 8
============
VALUES 句と完全な列リストがある INSERT INTO。行は更新されます。
INSERT INTO t1 ( a, b, c, d, e, f, g, h ) VALUES ( 1, 2, 3, 4, 5, 6, 7, 8 )
ON DUPLICATE KEY UPDATE t1.a = 10, t1.b = 20, t1.c = 30, t1.d = 40;
SELECT * FROM t1;
a b c d e f g h
======== ======== ======== ======== ======== ======== ======== ========
10 20 30 40 5 6 7 8
============
VALUES 句と部分的な列リストがある INSERT INTO。新しい行が挿入され、その行が更新されます。
INSERT INTO t1 ( a, b, c, d ) VALUES ( 1, 2, 3, 4 )
ON DUPLICATE KEY UPDATE t1.a = 11, t1.b = 12, t1.c = 13, t1.d = 14;
SELECT * FROM t1;
a b c d e f g h
======== ======== ======== ======== ======== ======== ======== ========
10 20 30 40 5 6 7 8
1 2 3 4 1 2 (Null) (Null)
INSERT INTO t1 ( a, b, c ) VALUES ( -1, -2, -3 )
ON DUPLICATE KEY UPDATE t1.a = 11, t1.b = 12, t1.c = 13, t1.d = 14;
SELECT * FROM t1;
a b c d e f g h
======== ======== ======== ======== ======== ======== ======== ========
10 20 30 40 5 6 7 8
11 12 13 14 1 2 (Null) (Null)
============
VALUES 句と DEFAULT がある INSERT INTO。行は、以前の状態に戻すように更新された後、重複キーに基づいて更新されます。
UPDATE t1 SET a = 1, b = 2, c = 3, d = 4, e = 11, f = 12 WHERE a = 11;
SELECT * FROM t1;
a b c d e f g h
======== ======== ======== ======== ======== ======== ======== ========
10 20 30 40 5 6 7 8
1 2 3 4 11 12 (Null) (Null)
INSERT INTO t1 ( a, b, c, d, e, f ) VALUES ( 1, 2, 3, 4, DEFAULT, DEFAULT )
ON DUPLICATE KEY UPDATE g = VALUES ( a ) + VALUES ( b ) + VALUES ( c ), h = VALUES ( e ) + VALUES ( f );
SELECT * FROM t1;
a b c d e f g h
======== ======== ======== ======== ======== ======== ======== ========
10 20 30 40 5 6 7 8
1 2 3 4 11 12 6 3
============
UPDATE の SET 句でサブクエリ式を使用して、Demodata サンプル データベースの Person テーブルの値を基に更新します。
INSERT INTO t1 VALUES ( 1, 2, 3, 4, 5, 6, 7, 8 )
ON DUPLICATE KEY UPDATE t1.a = 10, t1.b = 20, t1.c = ( SELECT TOP 1 id FROM demodata.person ORDER BY id ), t1.d = ( SELECT TOP 1 id FROM demodata.person ORDER BY id DESC, last_name );
SELECT * FROM t1;
a b c d e f g h
======== ======== ======== ======== ======== ======== ======== ========
10 20 100062607 998332124 5 6 7 8
1 2 3 4 11 12 6 3
DEFAULT を使用した場合に発生するエラー
次の例は、列が NOT NULL として定義されており、デフォルト値が定義されていないことによって起こり得るエラー状況を示します。
CREATE TABLE t1 (c1 INT DEFAULT 10, c2 INT NOT NULL, c3 INT DEFAULT 100 NOT NULL)
INSERT INTO t1 DEFAULT VALUES -- エラー:列 <c2> にデフォルト値が割り当てられていません。
INSERT INTO t1 VALUES (DEFAULT, DEFAULT, 10) -- エラー:列 <c2> にデフォルト値が割り当てられていません。
INSERT INTO t1 (c1,c2,c3) VALUES (1, DEFAULT, DEFAULT) -- エラー:列 <c2> にデフォルト値が割り当てられていません。
INSERT INTO t1 (c1,c3) VALUES (1, 10) -- エラー:列 <c2> はヌル値を許可しません。
============
次の例は、IDENTITY 列およびデフォルト値を持つ列に対し INSERT を使用したとき、どのようになるかを示します。
CREATE TABLE t (id IDENTITY, c1 INTEGER DEFAULT 100)
INSERT INTO t (id) VALUES (0)
INSERT INTO t VALUES (0,1)
INSERT INTO t VALUES (10,10)
INSERT INTO t VALUES (0,2)
INSERT INTO t (c1) VALUES (3)
SELECT * FROM t
SELECT によって、テーブルに次の行が含まれていることが示されます。
1, 100
2, 1
10, 10
11, 2
12, 3
最初の行は、IDENTITY 列に対して values 句で 0 を指定すると、テーブルが空の場合に挿入される値は 1 であることを示します。
またこの行は、デフォルト値を持つ列に対して values 句で値を指定しないと、指定されているデフォルト値が挿入されることも示します。
2 行目は、IDENTITY 列に対して values 句で 0 を指定すると、挿入される値は、IDENTITY 列中で最も大きな値より 1 大きい値になることを示します。
この行はまた、デフォルト値を持つ列に対して values 句で値を指定すると、指定した値によりデフォルト値が上書きされることを示します。
3 行目は、IDENTITY 列に対して values 句で 0 以外の値を指定すると、指定した値が挿入されることを示します。IDENTITY 列に対して指定された値を含む行が既に存在する場合は、"レコードのキー フィールドに重複するキー値があります(Btrieve エラー 5)" というメッセージが返され、INSERT は失敗します。
4 行目では再び、IDENTITY 列に対して values 句で 0 を指定すると、IDENTITY 列中で最も大きな値より 1 大きい値が挿入されることが示されています。これは、値の間に「ギャップ」がある場合でも当てはまります(つまり、IDENTITY 列が最も大きな値よりも小さい値の行が 1 行以上欠落するということです)。
5 行目は、IDENTITY 列に対して values 句で値を指定しないと、挿入される値は、IDENTITY 列中で最も大きな値より 1 大きい値になることを示します。
関連項目