Kategorien:

DML-Befehle – Allgemeines

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)

Unter diesem Thema:

Syntax

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

Erforderliche Parameter

Zieltabelle

Gibt die Zieltabelle an, in die Zeilen eingefügt werden sollen. Auf dieselbe Tabelle kann mehr als einmal verwiesen werden (in separaten WHEN-Klauseln).

VALUES ( Wert | DEFAULT | NULL [ , ... ] ) [ , ( ... ) ] oder . Abfrage

Gibt einen oder mehrere Werte an, die in die entsprechenden Spalten der Zieltabelle eingefügt werden sollen. Die Werte können entweder das Ergebnis einer Abfrage sein oder explizit (mit einer VALUES-Klausel) angegeben werden:

  • Geben Sie für eine Abfrage eine SELECT-Anweisung 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.

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

    • Wert: Fügt den explizit angegebenen Wert ein.

    • 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 unter Nutzungshinweise (unter diesem Thema).

Optionale Parameter

OVERWRITE

Gibt an, dass die Zieltabelle vor dem Einfügen in die Tabelle abgeschnitten wird, während die Zugriffssteuerungsrechte an der Tabelle erhalten bleiben.

INSERT-Anweisungen mit OVERWRITE können im Rahmen der aktuellen Transaktion verarbeitet werden, wodurch DDL-Anweisungen vermieden werden, die eine Transaktion übertragen, wie z. B.:

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

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

( Name_der_Zielspalte [ , ... ] )

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)

  • Um die Option OVERWRITE für INSERT verwenden zu können, muss Ihre Rolle über die Berechtigung DELETE für die Tabelle verfügen, da OVERWRITE die vorhandenen Datensätze in der Tabelle löscht.

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

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

Mehrzeiliges Einfügen mit explizit spezifizierten Werten

Fügen Sie zwei Datenzeilen in die employees-Tabelle ein, indem Sie beide Wertesätze in einer kommagetrennten 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       |
+------------+-----------+----------------+---------------+-------------+

Achten Sie beim mehrzeiligen Einfügen darauf, dass die Datentypen der eingefügten Werte über die Zeilen hinweg konsistent sind, da der Server den Datentyp der ersten Zeile als Richtlinie betrachtet. 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');

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

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;

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;

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

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

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

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