INSERTおよびUPSERTを使用した表の行の追加
このトピックでは、SQL for Oracle NoSQL DatabaseのINSERT文およびUPSERT文のを使用して、表の行を追加する方法の例を示します。
INSERT文を使用して、既存の表にある1つの行を挿入または更新できます。
例:
SQLBasicExamplesスクリプトを実行した場合は、Users
という名前の表がすでに作成されています。この表には、次の定義があります。
CREATE TABLE Users
(
id integer,
firstname string,
lastname string,
age integer,
income integer,
primary key (id)
);
sql-> describe table Users;
=== Information ===
+-------+-----+-------+----------+----------+--------+----------+---------+-------------+
| name | ttl | owner | sysTable | r2compat | parent | children | indexes | description |
+-------+-----+-------+----------+----------+--------+----------+---------+-------------+
| Users | | | N | N | | | | |
+-------+-----+-------+----------+----------+--------+----------+---------+-------------+
=== Fields ===
+----+-----------+---------+----------+-----------+----------+------------+----------+
| id | name | type | nullable | default | shardKey | primaryKey | identity |
+----+-----------+---------+----------+-----------+----------+------------+----------+
| 1 | id | Integer | N | NullValue | Y | Y | |
+----+-----------+---------+----------+-----------+----------+------------+----------+
| 2 | firstname | String | Y | NullValue | | | |
+----+-----------+---------+----------+-----------+----------+------------+----------+
| 3 | lastname | String | Y | NullValue | | | |
+----+-----------+---------+----------+-----------+----------+------------+----------+
| 4 | age | Integer | Y | NullValue | | | |
+----+-----------+---------+----------+-----------+----------+------------+----------+
| 5 | income | Integer | Y | NullValue | | | |
+----+-----------+---------+----------+-----------+----------+------------+----------+
新しい行をUsers
表に挿入するには、次のようにINSERT
文を使用します。すべての表の列に値を追加するため、列名を明示的に指定する必要はありません。
sql-> INSERT INTO Users VALUES (10, "John", "Smith", 22, 45000);
{"NumRowsInserted":1}
1 row returned
sql-> select * from Users;
{"id":10,"firstname":"John","lastname":"Smith","age":22,"income":45000}
すべてではなく一部の表の列にデータを挿入する場合は、INSERT文で列名を明示的に指定します。指定しない列には、NULL
または表の作成時に指定したデフォルト値のいずれかが割り当てられます。
sql-> INSERT INTO Users (id, firstname, income)
VALUES (11, "Mary", 5000);
{"NumRowsInserted":1}
1 row returned
sql-> select * from Users;
{"id":11,"firstname":"Mary","lastname":null,"age":null,"income":5000}
{"id":10,"firstname":"John","lastname":"Smith","age":22,"income":45000}
2 rows returned
UPSERT文の使用方法
UPSERT
という語はUPDATE
とINSERT
と組み合せたもので、この文の機能を表しています。行が存在しない場合は挿入し、存在する場合はその行を新しい値で更新する場合に、UPSERT
文を使用します。
たとえば、前の項の説明に従ってすでに新しい行を挿入している場合は、次の文を実行すると、ユーザーJohnの年齢が27、収入が60,000に更新されます。前のINSERT
文を実行していない場合、UPSERT
文によって、ユーザーIDが10の新しい行がUsers
表に挿入されます。
sql-> UPSERT INTO Users VALUES (10, "John", "Smith", 27, 60000);
{"NumRowsInserted":0}
1 row returned
sql-> UPSERT INTO Users VALUES (11, "Mary", "Brown", 28, 70000);
{"NumRowsInserted":0}
1 row returned
sql-> select * from Users;
{"id":10,"firstname":"John","lastname":"Smith","age":22,"income":60000}
{"id":11,"firstname":"Mary","lastname":"Brown","age":28,"income":70000}
2 rows returned
IDENTITY列の使用方法
IDENTITY列を使用すると、新しい表の行を挿入するたびに、表の列の値を自動的に生成できます。SQLリファレンス・ガイドのIDENTITY列を参照してください。
次のIDENTITY列のスタイル両方について、INSERT文を使用する方法の例を示します。
-
GENERATED ALWAYS AS IDENTITY
-
GENERATED BY DEFAULT [ON NULL] AS IDENTITY
1つの列DeptIdをGENERATED ALWAYS AS IDENTITYとして使用して、Employee_test
という名前の表を作成します。このIDENTITY列は主キーではありません。表に数行を挿入します。
sql-> CREATE TABLE EmployeeTest
(
Empl_id INTEGER,
Name STRING,
DeptId INTEGER GENERATED ALWAYS AS IDENTITY (CACHE 1),
PRIMARY KEY(Empl_id)
);
INSERT INTO Employee_test VALUES (148, 'Sally', DEFAULT);
INSERT INTO Employee_test VALUES (250, 'Joe', DEFAULT);
INSERT INTO Employee_test VALUES (346, 'Dave', DEFAULT);
INSERT文によって次の行が挿入され、IDENTITY列DeptId
には1、2および3の値が生成されます。
Empl_id | Name | DeptId |
---|---|---|
148 |
Sally |
1 |
250 |
Joe |
2 |
346 |
Dave |
3 |
Employee_test
表に行を挿入するときに、DeptId
IDENTITY列の値を指定することはできません。これは、この列をGENERATED ALWAYS AS IDENTITY
として定義したためです。列値にDEFAULTを指定すると、次のIDENTITY値が生成されます。反対に、次のSQL文を実行しようとすると、DeptId
列に値(200)を指定しているため、例外が発生します。
sql-> INSERT INTO Employee_test VALUES (566, 'Jane', 200);
Employee_test
表の列をGENERATED BY DEFAULT AS IDENTITY
として作成すると、値を指定しなかった場合にのみ、システムによって値が生成されます。たとえば、次のようにEmployee_test
表を定義して、前述したようにINSERT文を実行すると、従業員のDeptId
列に値200が挿入されます。
CREATE Table Employee_test
(
Empl_id INTEGER,
Name STRING,
DeptId INTEGER GENERATED BY DEFAULT AS IDENTITY (CACHE 1),
PRIMARY KEY(Empl_id)
);