Zoeken…


Basic INSERT

Laten we zeggen dat we een eenvoudige tabel hebben met de naam persoon:

CREATE TABLE person (
    person_id BIGINT,
    name VARCHAR(255).
    age INT,
    city VARCHAR(255)
);

De meest eenvoudige invoeging omvat het invoegen van alle waarden in de tabel:

INSERT INTO person VALUES (1, 'john doe', 25, 'new york');

Als u alleen specifieke kolommen wilt invoegen, moet u expliciet aangeven welke kolommen:

INSERT INTO person (name, age) VALUES ('john doe', 25);

Merk op dat als er beperkingen op de tabel bestaan, zoals NIET NULL, u deze kolommen in beide gevallen moet opnemen.

Meerdere rijen invoegen

U kunt meerdere rijen tegelijkertijd in de database invoegen:

INSERT INTO person (name, age) VALUES 
  ('john doe', 25),
  ('jane doe', 20);

Invoegen van selecteren

U kunt gegevens in een tabel invoegen als resultaat van een select-statement:

INSERT INTO person SELECT * FROM tmp_person WHERE age < 30;

Merk op dat de projectie van de selectie moet overeenkomen met de vereiste kolommen voor de invoeging. In dit geval heeft de tabel tmp_person dezelfde kolommen als person .

Gegevens invoegen met behulp van COPY

COPY is het bulk-insert-mechanisme van PostgreSQL. Het is een handige manier om gegevens over te dragen tussen bestanden en tabellen, maar het is ook veel sneller dan INSERT bij het toevoegen van meer dan een paar duizend rijen tegelijk.

Laten we beginnen met het maken van voorbeeldgegevensbestanden.

cat > samplet_data.csv

1,Yogesh
2,Raunak
3,Varun
4,Kamal
5,Hari
6,Amit

En we hebben een tabel met twee kolommen nodig waarin deze gegevens kunnen worden geïmporteerd.

CREATE TABLE copy_test(id int, name varchar(8));

Nu de daadwerkelijke kopieerbewerking, hiermee worden zes records in de tabel gemaakt.

COPY copy_test FROM '/path/to/file/sample_data.csv' DELIMITER ',';

In plaats van een bestand op schijf te gebruiken, kunnen gegevens van stdin ingevoegd

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

U kunt ook gegevens van een tabel naar een bestand kopiëren, zoals hieronder:

COPY copy_test TO 'path/to/file/sample_data.csv'  DELIMITER ',';

Voor meer informatie over COPY kunt u hier kijken

PLAATS gegevens en RETURING waarden

Als u gegevens invoegt in een tabel met een kolom voor automatisch ophogen en als u de waarde van de kolom voor automatisch ophogen wilt krijgen.

Stel dat u een tabel hebt met de naam 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)
);

Als u gegevens in my_table wilt invoegen en de id van die rij wilt ophalen:

INSERT INTO my_table(name, contact_number) VALUES ( 'USER', 8542621) RETURNING id;

Bovenstaande query retourneert het ID van de rij waar het nieuwe record is ingevoegd.

SELECT-gegevens in bestand.

U kunt de tabel KOPIËREN en in een bestand plakken.

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 - PLAATSEN ... BIJ CONFLICT UPDATE DOEN ...

sinds versie 9.5 biedt postgres UPSERT functionaliteit met INSERT instructie.

Stel dat u een tabel hebt met de naam my_table, gemaakt in verschillende eerdere voorbeelden. We voegen een rij in en retourneren de PK-waarde van de ingevoegde rij:

b=# INSERT INTO my_table (name,contact_number) values ('one',333) RETURNING id;
 id
----
  2
(1 row)

INSERT 0 1

Als we nu proberen een rij met een bestaande unieke sleutel in te voegen, wordt er een uitzondering gegenereerd:

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.

Upsert-functionaliteit biedt de mogelijkheid om het toch in te voegen en het conflict op te lossen:

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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow