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:
Syntax¶
INSERT [ OVERWRITE ] INTO <target_table> [ ( <target_col_name> [ , ... ] ) ]
{
VALUES ( { <value> | DEFAULT | NULL } [ , ... ] ) [ , ( ... ) ] |
<query>
}
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 einenNULL
-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 ... ;
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
und3
in den ersten beiden Zeilen und den Werten2
,3
und4
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, 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" }'));
mit:
INSERT INTO table1 (ID, varchar1, variant1) SELECT 4, 'Fourier', PARSE_JSON('{ "key1": "value1", "key2": "value2" }');
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;
+------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
| 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;
+------------+-------------------------+-------------------------+
| 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¶
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;
+------------+-----------+----------------+---------------+-------------+
| 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);
Der erste Insert funktioniert wie erwartet:
INSERT INTO demo_insert_type_mismatch (v) VALUES
('three'),
('four');
+-------------------------+
| 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');
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);
+-------------------------+
| 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 Vorwahl650
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 |
+------------+-----------+----------------+---------------+-------------+
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;
+------------------+-----------------+----------------+---------------+----------+
| 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:
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"
}');
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;
+------------+-----------+----------------+---------------+-------------+
| 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 |
|------------+-----------+----------------+---------------+-------------|
| 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';
Da die Option INSERT die Klausel 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 |
+------------+-----------+----------------+---------------+-------------+