INSERT
このステートメントにより、1 つのテーブルに列の値を挿入します。
構文
INSERT INTO テーブル名
[(列名[, 列名]...)] 挿入値
[ORDER BY order-by式[, order-by式]...]
テーブル名 ::= ユーザー定義名
列名 ::= ユーザー定義名
挿入値 ::= values句 | クエリ スペック
values句 ::= VALUES (式[, 式]...)
| DEFAULT VALUES
備考
INSERT、UPDATE、および DELETE ステートメントはアトミックな方法で動作します。つまり、複数の行の挿入、更新、または削除に失敗した場合、同じステートメントによって実行された前の行の挿入、更新、または削除がすべてロール バックされます。
Pervasive.SQL 2000 以前のバージョンで作成されたファイルのレガシー データ型はすべて、ヌル値を許可すると報告されます。結果として、すべてのレガシー データ型の列に、擬似ヌル変換を行わないでヌルを挿入できます。次のデータ型は、デフォルトで擬似ヌルとして扱われます。
Date | Decimal | Money | Numeric |
NumericSA | NumericSTS | Timestamp | |
通常、レガシー列を擬似ヌルに変換する場合、列の内容がヌルであるか照会できるように、バイナリ値の 1 つを取り上げてヌル値として使用するため、バイナリ値を 1 つ失います。ただし、上記のデータ型は設計の都合上、通常のデータ範囲に加えて、ヌル用に異なる固有の内部値を持っています。これらのデータ型を使用すると、バイナリ値をヌルに変換する場合に 1 つも値を失わないので、それらをデフォルトで擬似ヌルと判断しても差し支えありません。
残りのデータ型は「レガシー ヌル許容」とみなされます。これは、ヌルを挿入できるということです。しかし、値を照会すると、非ヌルのバイナリ同値が返されます。これと同じバイナリ同値を WHERE 句で使用して、特定の値を取得する必要があります。
バイナリ同値は次のとおりです。
•Binary 型の場合は 0
•string および BLOB 型(レガシー型の LVAR と NOTE)の場合は空文字列
CURTIME()、CURDATE() および NOW() 変数
CURTIME()、CURDATE()、NOW() の各変数を INSERT ステートメントで使用して、現在の現地日付、時刻、およびタイムスタンプの値を挿入できます。
CREATE TABLE table1 (col1 DATE)
INSERT INTO table1 VALUES (CURDATE())
現在の UTC 時刻、日付、またはタイムスタンプを CURRENT_TIME() または関連する関数を使って挿入するには、次のような SQL ステートメントを構成する必要があります。
CREATE TABLE table1 (col1 DATE)
INSERT INTO table1 SELECT CURRENT_DATE()
デフォルト値の使用
次の表は、デフォルト値とヌル値を許可する列との相互作用を示しています。
表 27 デフォルト値とヌル値を許可する列
列のタイプ | 列にリテラルのデフォルト値が定義されていない場合に使用するデフォルト値: | リテラル値が定義されている場合のデフォルト値: |
ヌル値を許可 | NULL | 定義どおり |
NOT NULL | エラー-"列にデフォルト値が割り当てられていません。" | 定義どおり |
v2000 以前のヌル許容 | 列の疑似ヌル値 | 定義どおり |
ステートメントで、デフォルト値が定義されている NOT NULL 列に明示的なヌル値を挿入しようとすると、エラーが発生して失敗します。デフォルト値は、ヌル挿入を試みたその場では使用されません。
デフォルト値が定義されている列については、INSERT ステートメントの中で、挿入する列リストからこの列を省略するか、または挿入値の指定場所に DEFAULT キーワードを使用することで、デフォルト値を呼び出すことができます。
テーブル内の列がすべて、ヌル値を許可するかデフォルト値が定義されているかのいずれかである場合は、values 句に DEFAULT VALUES を指定することで、すべてのデフォルト値を含むレコードを挿入できます。一部の列がヌル値を許可していないかデフォルト値が定義されていない場合、または列リストを指定しない場合には、DEFAULT VALUES 句は使用できません。
BLOB、CLOB、または BINARY 型の列定義へのデフォルト値の設定は、現在のところサポートされていません。
Long データ
PSQL でサポートされるリテラル文字列の最大長は 15,000 バイトです。いくつかの異なる方法を用いて、これよりも長いデータを挿入することができます。直接の SQL ステートメントを使用している場合は、挿入または更新ステートメントを複数の呼び出しに分割できます。次のようなステートメントで開始します。
UPDATE table1 SET longfield = '15000 バイトのテキスト' WHERE 制限
次に、それ以上のデータを追加する次のステートメントを発行します。
UPDATE table1 SET longfield = notefield + '15000 バイトを超えるテキスト' WHERE restriction
例
このセクションでは、INSERT のいくつかの例を示します。
次の例は、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
============
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 大きい値になることを示します。
関連項目