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.

Beispiele

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:

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

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;

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

Mehrzeiliges Einfügen mit explizit spezifizierten Werten

Fügen Sie zwei Datenzeilen in die employees-Tabelle ein, indem Sie beide Wertemengen in einer durch Kommas getrennten Liste in der VALUES-Klausel bereitstellen:

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

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. Folgendes wird fehlschlagen, weil sich der Datentyp des Wertes in der zweiten Zeile vom Datentyp des Wertes in der ersten Zeile unterscheidet, obwohl beide Werte auf VARCHAR gesetzt werden können, was dem Datentyp der Spalte in der Tabelle entspricht:

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

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;

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

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:

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"
  }');
Copy

Einfügen mit Überschreiben

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

Diese Anweisung wird mit der Klausel OVERWRITE in die Tabelle „sf_employees“ eingefügt:

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

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

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