postgresql
EINFÜGEN
Suche…
Basic INSERT
Nehmen wir an, wir haben eine einfache Tabelle namens person:
CREATE TABLE person (
person_id BIGINT,
name VARCHAR(255).
age INT,
city VARCHAR(255)
);
Die einfachste Einfügung besteht darin, alle Werte in die Tabelle einzufügen:
INSERT INTO person VALUES (1, 'john doe', 25, 'new york');
Wenn Sie nur bestimmte Spalten einfügen möchten, müssen Sie explizit angeben, welche Spalten:
INSERT INTO person (name, age) VALUES ('john doe', 25);
Wenn in der Tabelle Einschränkungen vorhanden sind, z. B. NOT NULL, müssen Sie diese Spalten in beiden Fällen angeben.
Mehrere Zeilen einfügen
Sie können mehrere Zeilen gleichzeitig in die Datenbank einfügen:
INSERT INTO person (name, age) VALUES
('john doe', 25),
('jane doe', 20);
Einfügen aus auswählen
Sie können Daten als Ergebnis einer select-Anweisung in eine Tabelle einfügen:
INSERT INTO person SELECT * FROM tmp_person WHERE age < 30;
Beachten Sie, dass die Projektion der Auswahl mit den für das Einfügen erforderlichen Spalten übereinstimmen muss. In diesem Fall hat die Tabelle tmp_person
die gleichen Spalten wie person
.
Daten mit COPY einfügen
COPY ist der Bulk-Insert-Mechanismus von PostgreSQL. Dies ist eine bequeme Methode zum Übertragen von Daten zwischen Dateien und Tabellen, aber auch weitaus schneller als INSERT
wenn mehr als ein paar tausend Zeilen gleichzeitig hinzugefügt werden.
Beginnen wir mit dem Erstellen einer Beispieldatendatei.
cat > samplet_data.csv
1,Yogesh
2,Raunak
3,Varun
4,Kamal
5,Hari
6,Amit
Und wir brauchen eine zweispaltige Tabelle, in die diese Daten importiert werden können.
CREATE TABLE copy_test(id int, name varchar(8));
Beim eigentlichen Kopiervorgang werden nun sechs Datensätze in der Tabelle erstellt.
COPY copy_test FROM '/path/to/file/sample_data.csv' DELIMITER ',';
Anstatt eine Datei auf der Festplatte zu verwenden, können Daten aus stdin
COPY copy_test FROM stdin DELIMITER ',';
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 7,Amol
>> 8,Amar
>> \.
Time: 85254.306 ms
SELECT * FROM copy_test ;
id | name
----+--------
1 | Yogesh
3 | Varun
5 | Hari
7 | Amol
2 | Raunak
4 | Kamal
6 | Amit
8 | Amar
Sie können Daten auch wie folgt aus einer Tabelle in eine Datei kopieren:
COPY copy_test TO 'path/to/file/sample_data.csv' DELIMITER ',';
Weitere Informationen zu COPY finden Sie hier
INSERT-Daten und RETURING-Werte
Wenn Sie Daten in eine Tabelle mit einer Auto-Increment-Spalte einfügen und den Wert der Auto-Increment-Spalte abrufen möchten.
my_table
Sie haben eine Tabelle namens my_table
:
CREATE TABLE my_table
(
id serial NOT NULL, -- serial data type is auto incrementing four-byte integer
name character varying,
contact_number integer,
CONSTRAINT my_table_pkey PRIMARY KEY (id)
);
Wenn Sie Daten in my_table
einfügen my_table
und die ID dieser Zeile erhalten:
INSERT INTO my_table(name, contact_number) VALUES ( 'USER', 8542621) RETURNING id;
Die obige Abfrage gibt die ID der Zeile zurück, in die der neue Datensatz eingefügt wurde.
Daten in Datei auswählen.
Sie können die Tabelle KOPIEREN und in eine Datei einfügen.
postgres=# select * from my_table;
c1 | c2 | c3
----+----+----
1 | 1 | 1
2 | 2 | 2
3 | 3 | 3
4 | 4 | 4
5 | 5 |
(5 rows)
postgres=# copy my_table to '/home/postgres/my_table.txt' using delimiters '|' with null as 'null_string' csv header;
COPY 5
postgres=# \! cat my_table.txt
c1|c2|c3
1|1|1
2|2|2
3|3|3
4|4|4
5|5|null_string
UPSERT - INSERT ... ON CONFLICT AKTUALISIEREN ...
Seit Version 9.5 bietet UPSERT
die UPSERT
Funktionalität mit INSERT
Anweisung.
Angenommen, Sie haben eine Tabelle namens my_table, die in mehreren vorherigen Beispielen erstellt wurde. Wir fügen eine Zeile ein und geben den PK-Wert der eingefügten Zeile zurück:
b=# INSERT INTO my_table (name,contact_number) values ('one',333) RETURNING id;
id
----
2
(1 row)
INSERT 0 1
Wenn wir jetzt versuchen, eine Zeile mit einem vorhandenen eindeutigen Schlüssel einzufügen, wird eine Ausnahme ausgelöst:
b=# INSERT INTO my_table values (2,'one',333);
ERROR: duplicate key value violates unique constraint "my_table_pkey"
DETAIL: Key (id)=(2) already exists.
Die Upsert-Funktion bietet die Möglichkeit, sie trotzdem einzufügen und den Konflikt zu lösen:
b=# INSERT INTO my_table values (2,'one',333) ON CONFLICT (id) DO UPDATE SET name = my_table.name||' changed to: "two" at '||now() returning *;
id | name | contact_number
----+-----------------------------------------------------------------------------------------------------------+----------------
2 | one changed to: "two" at 2016-11-23 08:32:17.105179+00 | 333
(1 row)
INSERT 0 1