カテゴリ:

DML コマンド - 一般

INSERT

テーブルに1つ以上の行を挿入して、テーブルを更新します。テーブルの各列に挿入される値は、明示的に指定するか、クエリの結果にすることができます。

こちらもご参照ください:

INSERT (マルチテーブル)

このトピックの内容:

構文

INSERT [ OVERWRITE ] INTO <target_table> [ ( <target_col_name> [ , ... ] ) ]
                                         { { VALUES ( { <value> | DEFAULT | NULL } [ , ... ] ) [ , ( ... ) ] } | <query> }

必須パラメーター

ターゲットテーブル

行を挿入するターゲットテーブルを指定します。同じテーブルが(別々の WHEN 句で)複数回参照される場合があります。

VALUES ( | DEFAULT | NULL [ , ... ] ) [ , ( ... ) ] または . クエリ

ターゲットテーブルの対応する列に挿入する1つ以上の値を指定します。値は、クエリの結果または明示的に指定された(VALUES 句を使用して)ことができます。

  • クエリの場合、対応する列に挿入される値を返す SELECT ステートメントを指定します。これにより、1つ以上のソーステーブルからターゲットテーブルに行を挿入できます。

  • VALUES 句では、次を指定できます。

    • :明示的に指定された値を挿入します。

    • DEFAULT:ターゲットテーブルの対応する列にデフォルト値を挿入します。

    • NULL: NULL 値を挿入します。

    句の各値はコンマで区切る必要があります。句に追加の値セットを指定することにより、複数の行を挿入できます。詳細については、 使用上の注意 (このトピック)をご参照ください。

オプションのパラメーター

OVERWRITE

テーブルに対するアクセス制御権限を保持しながら、テーブルに挿入する前にターゲットテーブルを切り捨てることを指定します。

INSERT OVERWRITE を含むステートメントは、現在のトランザクションのスコープ内で処理できます。これにより、次のようなトランザクションをコミットする DDL ステートメントを回避できます。

DROP TABLE t;
CREATE TABLE t AS SELECT * FROM ... ;

デフォルト:値なし(ターゲットテーブルは、挿入を実行する前に切り捨て られない

( ターゲット列名 [ , ... ] )

対応する値が挿入されるターゲットテーブルの1つ以上の列を指定します。指定されたターゲット列の数は、 VALUES 句で指定された値または列の値と一致する必要があります(値がクエリの結果である場合)。

デフォルト:値なし(ターゲットテーブルの列が すべて 更新されます)

使用上の注意

  • 単一の INSERT コマンドを使用して、 VALUES 句でコンマで区切られた追加の値セットを指定することにより、テーブルに複数の行を挿入できます。

    例えば、次の句は3列のテーブルに3行を挿入しますが、最初の2行には値 12、および 3 を、3行目には値 23、および 4 を挿入します。

    VALUES ( 1, 2, 3 ) , ( 1, 2, 3 ) , ( 2, 3, 4)

  • INSERT で OVERWRITE オプションを使用するには、 OVERWRITE がテーブル内の既存のレコードを削除するため、テーブルに対する DELETE 権限がロールに必要です。

クエリを使用した単一行の挿入

3つの文字列値を日付またはタイムスタンプに変換し、それらを mytable テーブルの単一行に挿入します。

DESC TABLE mytable;

+------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+
| name | type             | kind   | null? | default | primary key | unique key | check | expression | comment |
|------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------|
| COL1 | DATE             | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| COL2 | TIMESTAMP_NTZ(9) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| COL3 | TIMESTAMP_NTZ(9) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
+------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+

INSERT INTO mytable
  SELECT TO_DATE('2013-05-08T23:39:20.123'), TO_TIMESTAMP('2013-05-08T23:39:20.123'), TO_TIMESTAMP('2013-05-08T23:39:20.123');

SELECT * FROM mytable;

+------------+-------------------------+-------------------------+
| COL1       | COL2                    | COL3                    |
|------------+-------------------------+-------------------------|
| 2013-05-08 | 2013-05-08 23:39:20.123 | 2013-05-08 23:39:20.123 |
+------------+-------------------------+-------------------------+

前の例と同様ですが、テーブルの最初と3番目の列のみを更新するように指定します。

INSERT INTO mytable (col1, col3)
  SELECT TO_DATE('2013-05-08T23:39:20.123'), TO_TIMESTAMP('2013-05-08T23:39:20.123');

SELECT * FROM mytable;

+------------+-------------------------+-------------------------+
| COL1       | COL2                    | COL3                    |
|------------+-------------------------+-------------------------|
| 2013-05-08 | 2013-05-08 23:39:20.123 | 2013-05-08 23:39:20.123 |
| 2013-05-08 | NULL                    | 2013-05-08 23:39:20.123 |
+------------+-------------------------+-------------------------+

明示的に指定された値を使用した複数行の挿入

VALUES 句のコンマ区切りリストで値の両方のセットを提供することにより、データの2行を employees テーブルに挿入します。

SELECT * FROM employees;

+------------+-----------+----------------+---------------+-------------+
| FIRST_NAME | LAST_NAME | WORKPHONE      | CITY          | POSTAL_CODE |
|------------+-----------+----------------+---------------+-------------|
| May        | Franklin  | 1-650-249-5198 | San Francisco | 94115       |
| Gillian    | Patterson | 1-650-859-3954 | San Francisco | 94115       |
+------------+-----------+----------------+---------------+-------------+

INSERT INTO employees
  VALUES
  ('Lysandra','Reeves','1-212-759-3751','New York',10018),
  ('Michael','Arnett','1-650-230-8467','San Francisco',94116);

SELECT * FROM employees;

+------------+-----------+----------------+---------------+-------------+
| FIRST_NAME | LAST_NAME | WORKPHONE      | CITY          | POSTAL_CODE |
|------------+-----------+----------------+---------------+-------------|
| May        | Franklin  | 1-650-249-5198 | San Francisco | 94115       |
| Gillian    | Patterson | 1-650-859-3954 | San Francisco | 94115       |
| Lysandra   | Reeves    | 1-212-759-3751 | New York      | 10018       |
| Michael    | Arnett    | 1-650-230-8467 | San Francisco | 94116       |
+------------+-----------+----------------+---------------+-------------+

複数行の挿入では、サーバーが最初の行のデータ型をガイドとして参照するため、挿入された値のデータ型が行全体で一貫していることを確認してください。次の例では、2番目の行の値のデータ型が最初の行の値のデータ型と異なるためエラーが発生します。これは、両方の値を VARCHAR (列のデータ型)に強制変換できる場合でも同様です。これは次のテーブルの列のデータ型です:

CREATE TABLE t1 (v VARCHAR);

-- works as expected.
INSERT INTO t1 (v) VALUES
   ('three'),
   ('four');

-- Fails with error "Numeric value 'd' is not recognized"
-- even though the data type of 'd' is the same as the
-- data type of the column v.
INSERT INTO t1 (v) VALUES
   (3),
   ('d');

クエリを使用した複数行挿入

contractors テーブルの複数行のデータを employees テーブルに挿入します。

  • worknum 列に市外局番 650 が含まれる行のみを選択します。

  • city 列に NULL 値を挿入します。

SELECT * FROM employees;

+------------+-----------+----------------+---------------+-------------+
| FIRST_NAME | LAST_NAME | WORKPHONE      | CITY          | POSTAL_CODE |
|------------+-----------+----------------+---------------+-------------|
| May        | Franklin  | 1-650-249-5198 | San Francisco | 94115       |
| Gillian    | Patterson | 1-650-859-3954 | San Francisco | 94115       |
| Lysandra   | Reeves    | 1-212-759-3751 | New York      | 10018       |
| Michael    | Arnett    | 1-650-230-8467 | San Francisco | 94116       |
+------------+-----------+----------------+---------------+-------------+

SELECT * FROM contractors;

+------------------+-----------------+----------------+---------------+----------+
| CONTRACTOR_FIRST | CONTRACTOR_LAST | WORKNUM        | CITY          | ZIP_CODE |
|------------------+-----------------+----------------+---------------+----------|
| Bradley          | Greenbloom      | 1-650-445-0676 | San Francisco | 94110    |
| Cole             | Simpson         | 1-212-285-8904 | New York      | 10001    |
| Laurel           | Slater          | 1-650-633-4495 | San Francisco | 94115    |
+------------------+-----------------+----------------+---------------+----------+

INSERT INTO employees(first_name, last_name, workphone, city,postal_code)
  SELECT
    contractor_first,contractor_last,worknum,NULL,zip_code
  FROM contractors
  WHERE CONTAINS(worknum,'650');

SELECT * FROM employees;

+------------+------------+----------------+---------------+-------------+
| FIRST_NAME | LAST_NAME  | WORKPHONE      | CITY          | POSTAL_CODE |
|------------+------------+----------------+---------------+-------------|
| May        | Franklin   | 1-650-249-5198 | San Francisco | 94115       |
| Gillian    | Patterson  | 1-650-859-3954 | San Francisco | 94115       |
| Lysandra   | Reeves     | 1-212-759-3751 | New York      | 10018       |
| Michael    | Arnett     | 1-650-230-8467 | San Francisco | 94116       |
| Bradley    | Greenbloom | 1-650-445-0676 | NULL          | 94110       |
| Laurel     | Slater     | 1-650-633-4495 | NULL          | 94115       |
+------------+------------+----------------+---------------+-------------+

共通のテーブル式を使用して、 contractors テーブルから employees テーブルに複数行のデータを挿入します。

INSERT INTO employees (first_name,last_name,workphone,city,postal_code)
  WITH cte AS
    (SELECT contractor_first AS first_name,contractor_last AS last_name,worknum AS workphone,city,zip_code AS postal_code
     FROM contractors)
  SELECT first_name,last_name,workphone,city,postal_code
  FROM cte;

ソーステーブルの id 列の INNER JOIN を使用して、2つのテーブル(emp_addremp_ph)の列を3番目のテーブル(emp)に挿入します。

INSERT INTO emp (id,first_name,last_name,city,postal_code,ph)
  SELECT a.id,a.first_name,a.last_name,a.city,a.postal_code,b.ph
  FROM emp_addr a
  INNER JOIN emp_ph b ON a.id = b.id;

JSON データの複数行挿入

2つの JSON オブジェクトをテーブルの VARIANT 列に挿入します。

INSERT INTO prospects
  SELECT PARSE_JSON(column1)
  FROM VALUES
  ('{
    "_id": "57a37f7d9e2b478c2d8a608b",
    "name": {
      "first": "Lydia",
      "last": "Williamson"
    },
    "company": "Miralinz",
    "email": "lydia.williamson@miralinz.info",
    "phone": "+1 (914) 486-2525",
    "address": "268 Havens Place, Dunbar, Rhode Island, 7725"
  }')
  , ('{
    "_id": "57a37f7d622a2b1f90698c01",
    "name": {
      "first": "Denise",
      "last": "Holloway"
    },
    "company": "DIGIGEN",
    "email": "denise.holloway@digigen.net",
    "phone": "+1 (979) 587-3021",
    "address": "441 Dover Street, Ada, New Mexico, 5922"
  }');

上書きを使用して挿入

この例では、 INSERT と OVERWRITE を使用して、 employees テーブルに新しいレコードが追加された後、 employees から sf_employees テーブルを再構築します。

両方のテーブルの初期データは次のとおりです。

SELECT * FROM employees;
+------------+-----------+----------------+---------------+-------------+
| FIRST_NAME | LAST_NAME | WORKPHONE      | CITY          | POSTAL_CODE |
|------------+-----------+----------------+---------------+-------------|
| May        | Franklin  | 1-650-111-1111 | San Francisco | 94115       |
| Gillian    | Patterson | 1-650-222-2222 | San Francisco | 94115       |
| Lysandra   | Reeves    | 1-212-222-2222 | New York      | 10018       |
| Michael    | Arnett    | 1-650-333-3333 | San Francisco | 94116       |
+------------+-----------+----------------+---------------+-------------+
SELECT * FROM sf_employees;
+------------+-----------+----------------+---------------+-------------+
| FIRST_NAME | LAST_NAME | WORKPHONE      | CITY          | POSTAL_CODE |
|------------+-----------+----------------+---------------+-------------|
| Martin     | Short     | 1-650-999-9999 | San Francisco | 94115       |
+------------+-----------+----------------+---------------+-------------+

次のステートメントは、 OVERWRITE 句を使用してsf_employeesテーブルに挿入します。

INSERT OVERWRITE INTO sf_employees
  SELECT * FROM employees
  WHERE city = 'San Francisco';

INSERT は OVERWRITE オプションを使用したため、sf_employeesの古い行はなくなりました。

SELECT * FROM sf_employees;
+------------+-----------+----------------+---------------+-------------+
| FIRST_NAME | LAST_NAME | WORKPHONE      | CITY          | POSTAL_CODE |
|------------+-----------+----------------+---------------+-------------|
| May        | Franklin  | 1-650-111-1111 | San Francisco | 94115       |
| Gillian    | Patterson | 1-650-222-2222 | San Francisco | 94115       |
| Michael    | Arnett    | 1-650-333-3333 | San Francisco | 94116       |
+------------+-----------+----------------+---------------+-------------+