INSERT

Aktualisiert eine Tabelle, indem eine oder mehrere Zeilen in die Tabelle eingefügt werden. Die in jede Spalte der Tabelle eingefügten Werte können explizit angegeben werden oder das Ergebnis einer Abfrage sein.

Siehe auch:

INSERT (mehrere Tabellen)

Syntax

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

Erforderliche Parameter

target_table

Gibt die Zieltabelle an, in die Zeilen eingefügt werden sollen.

VALUES ( value | DEFAULT | NULL [ , ... ] )  [ , ( ... ) ]

Gibt einen oder mehrere Werte an, die in die entsprechenden Spalten der Zieltabelle eingefügt werden sollen.

In einer VALUES-Klausel können Sie Folgendes angeben:

  • value: Fügt den explizit angegebenen Wert ein. Der Wert kann ein Literal oder ein Ausdruck sein.

  • DEFAULT: Fügt den Standardwert für die entsprechende Spalte in die Zieltabelle ein.

  • NULL: Fügt einen NULL-Wert ein.

Jeder Wert in der Klausel muss durch ein Komma getrennt werden.

Sie können mehrere Zeilen einfügen, indem Sie zusätzliche Wertemengen in der Klausel angeben. Weitere Details dazu finden Sie in den Nutzungshinweisen und den Beispielen (unter diesem Thema).

query

Geben Sie eine Abfrageanweisung an, die Werte zurückgibt, die in die entsprechenden Spalten eingefügt werden sollen. Auf diese Weise können Sie Zeilen aus einer oder mehreren Quelltabellen in eine Zieltabelle einfügen.

Optionale Parameter

OVERWRITE

Gibt an, dass die Zieltabelle vor dem Einfügen der Werte in die Tabelle abgeschnitten werden soll. Beachten Sie, dass die Angabe dieser Option keine Auswirkungen auf die Zugriffssteuerungsrechte der Tabelle hat.

INSERT-Anweisungen mit OVERWRITE können im Rahmen der aktuellen Transaktion verarbeitet werden, wodurch DDL-Anweisungen vermieden werden, die eine Transaktion bestätigen (Commit), wie z. B.:

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

Standard: Kein Wert (die Zieltabelle wird vor dem Einfügen nicht gekürzt).

( target_col_name [ , ... ] )

Gibt eine oder mehrere Spalten in der Zieltabelle an, in die die entsprechenden Werte eingefügt werden. Die Anzahl der angegebenen Zielspalten muss mit der Anzahl der angegebenen Werte oder Spalten (wenn die Werte das Ergebnis einer Abfrage sind) in der VALUES-Klausel übereinstimmen.

Standard: Kein Wert (alle Spalten in der Zieltabelle werden aktualisiert)

Nutzungshinweise

  • Mit einem einzigen INSERT-Befehl können Sie mehrere Zeilen in eine Tabelle einfügen, indem Sie zusätzliche Wertemengen angeben, die durch Kommas in der VALUES-Klausel getrennt sind.

    Die folgende Klausel würde beispielsweise 3 Zeilen in eine 3-spaltige Tabelle einfügen, mit den Werten 1, 2 und 3 in den ersten beiden Zeilen und den Werten 2, 3 und 4 in der dritten Zeile:

    VALUES ( 1, 2, 3 ) ,
           ( 1, 2, 3 ) ,
           ( 2, 3, 4 )
    
    Copy
  • Um die Option OVERWRITE für INSERT verwenden zu können, müssen Sie eine Rolle verwenden, die über die Berechtigung DELETE für die Tabelle verfügt, da OVERWRITE die vorhandenen Datensätze in der Tabelle löscht.

  • Einige Ausdrücke können nicht in der VALUES-Klausel angegeben werden. Alternativ können Sie den Ausdruck in einer Abfrageklausel angeben. Sie können zum Beispiel folgende Ersetzung vornehmen:

    INSERT INTO table1 (ID, varchar1, variant1)
        VALUES (4, 'Fourier', PARSE_JSON('{ "key1": "value1", "key2": "value2" }'));
    
    Copy

    mit:

    INSERT INTO table1 (ID, varchar1, variant1)
        SELECT 4, 'Fourier', PARSE_JSON('{ "key1": "value1", "key2": "value2" }');
    
    Copy
  • Die VALUES-Klausel ist auf 16.384 Zeilen begrenzt. Diese Grenze gilt für eine einzelne INSERT INTO … VALUES-Anweisung und eine einzelne INSERT INTO … SELECT … FROM VALUES-Anweisung. Erwägen Sie die Verwendung des Befehls COPY INTO <Tabelle>, um ein Massenladen von Daten auszuführen. Weitere Informationen zur Verwendung der VALUES-Klausel in einer SELECT-Anweisung finden Sie unter VALUES.

  • Informationen zum Einfügen von Daten in Hybridtabellen finden Sie unter Laden von Daten.

Beispiele

Die folgenden Beispiele verwenden den Befehl INSERT.

Einzeiliges Einfügen mit einer Abfrage

Konvertieren Sie drei Zeichenfolgenwerte in Daten oder Zeitstempel und fügen Sie sie in eine einzelne Zeile in der mytable-Tabelle ein:

CREATE OR REPLACE TABLE mytable (
  col1 DATE,
  col2 TIMESTAMP_NTZ,
  col3 TIMESTAMP_NTZ);

DESC TABLE mytable;
Copy
+------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
| name | type             | kind   | null? | default | primary key | unique key | check | expression | comment | policy name | privacy domain |
|------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------|
| COL1 | DATE             | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| COL2 | TIMESTAMP_NTZ(9) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| COL3 | TIMESTAMP_NTZ(9) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | 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;
Copy
+------------+-------------------------+-------------------------+
| COL1       | COL2                    | COL3                    |
|------------+-------------------------+-------------------------|
| 2013-05-08 | 2013-05-08 23:39:20.123 | 2013-05-08 23:39:20.123 |
+------------+-------------------------+-------------------------+

Wie im vorherigen Beispiel, aber geben Sie an, dass nur die erste und dritte Spalte der Tabelle aktualisiert werden sollen:

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;
Copy
+------------+-------------------------+-------------------------+
| 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 |
+------------+-------------------------+-------------------------+

Mehrzeiliges Einfügen mit explizit spezifizierten Werten

Erstellen Sie die Tabelle employees und fügen Sie vier Datenzeilen ein, indem Sie in der VALUES-Klausel Wertemengen in einer kommagetrennten Liste angeben:

CREATE TABLE employees (
  first_name VARCHAR,
  last_name VARCHAR,
  workphone VARCHAR,
  city VARCHAR,
  postal_code VARCHAR);

INSERT INTO employees
  VALUES
    ('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 employees;
Copy
+------------+-----------+----------------+---------------+-------------+
| 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       |
+------------+-----------+----------------+---------------+-------------+

Achten Sie beim mehrzeiligen Einfügen darauf, dass die Datentypen der eingefügten Werte über die Zeilen hinweg konsistent sind, da der Datentyp der ersten Zeile als Richtlinie betrachtet wird. Erstellen Sie eine Tabelle und fügen Sie zwei Zeilen ein:

CREATE OR REPLACE TABLE demo_insert_type_mismatch (v VARCHAR);
Copy

Der erste Insert funktioniert wie erwartet:

INSERT INTO demo_insert_type_mismatch (v) VALUES
  ('three'),
  ('four');
Copy
+-------------------------+
| number of rows inserted |
|-------------------------|
|                       2 |
+-------------------------+

Der zweite Insert schlägt fehl, weil der Datentyp des Werts in der zweiten Zeile ('d') eine Zeichenfolge ist, die sich vom numerischen Datentyp des Werts in der ersten Zeile (3) unterscheidet. Der Insert schlägt fehl, obwohl beide Werte auf VARCHAR gesetzt werden können, was dem Datentyp der Spalte in der Tabelle entspricht. Der Insert schlägt fehl, obwohl der Datentyp des Werts 'd' derselbe ist wie der Datentyp der Spalte v:

INSERT INTO demo_insert_type_mismatch (v) VALUES
  (3),
  ('d');
Copy
100038 (22018): DML operation to table DEMO_INSERT_TYPE_MISMATCH failed on column V with error: Numeric value 'd' is not recognized

Wenn die Datentypen in den Zeilen übereinstimmen, ist der Insert erfolgreich und beide numerischen Werte werden auf den Datentyp VARCHAR gesetzt:

INSERT INTO demo_insert_type_mismatch (v) VALUES
  (3),
  (4);
Copy
+-------------------------+
| number of rows inserted |
|-------------------------|
|                       2 |
+-------------------------+

Mehrzeiliges Einfügen mit einer Abfrage

Fügen Sie mehrere Datenzeilen aus der Tabelle contractors in die Tabelle employees ein:

  • Markieren Sie nur die Zeilen, in denen die Spalte worknum die Vorwahl 650 enthält.

  • Fügen Sie einen NULL-Wert in die Spalte city ein.

SELECT * FROM employees;
Copy
+------------+-----------+----------------+---------------+-------------+
| 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       |
+------------+-----------+----------------+---------------+-------------+
CREATE TABLE contractors (
  contractor_first VARCHAR,
  contractor_last VARCHAR,
  worknum VARCHAR,
  city VARCHAR,
  zip_code VARCHAR);

INSERT INTO contractors
  VALUES
    ('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);

SELECT * FROM contractors;
Copy
+------------------+-----------------+----------------+---------------+----------+
| 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;
Copy
+------------+------------+----------------+---------------+-------------+
| 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       |
+------------+------------+----------------+---------------+-------------+

Fügen Sie mehrere Datenzeilen aus der Tabelle contractors mit einem allgemeinen Tabellenausdruck in die Tabelle employees ein:

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;
Copy

Fügen Sie Spalten aus zwei Tabellen (emp_addr, emp_ph) in eine dritte Tabelle (emp) ein, indem Sie ein INNER JOIN auf der id-Spalte der Quelltabellen verwenden:

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;
Copy

Mehrzeiliges Einfügen bei JSON-Daten

Fügen Sie zwei JSON-Objekte in eine VARIANT-Spalte einer Tabelle ein:

CREATE TABLE prospects (column1 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, 02801"
  }')
  , ('{
    "_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, 87105"
  }');
Copy

Einfügen mit OVERWRITE

In diesem Beispiel wird INSERT mit OVERWRITE verwendet, um die Tabelle sf_employees aus employees neu zu erstellen, nachdem neue Datensätze zur Tabelle employees hinzugefügt wurden.

Hier sind die Anfangsdaten für beide Tabellen:

SELECT * FROM employees;
Copy
+------------+-----------+----------------+---------------+-------------+
| 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;
Copy
+------------+-----------+----------------+---------------+-------------+
| FIRST_NAME | LAST_NAME | WORKPHONE      | CITY          | POSTAL_CODE |
|------------+-----------+----------------+---------------+-------------|
| Mary       | Smith     | 1-650-999-9999 | San Francisco | 94115       |
+------------+-----------+----------------+---------------+-------------+

Diese Anweisung fügt mit der OVERWRITE-Klausel Zeilen in die Tabelle sf_employees ein:

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

Da die Option INSERT die Klausel OVERWRITE verwendet hat, sind die alten Zeilen von sf_employees überschrieben:

SELECT * FROM sf_employees;
Copy
+------------+-----------+----------------+---------------+-------------+
| 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       |
+------------+-----------+----------------+---------------+-------------+