postgresql
FÖRA IN
Sök…
Grundläggande INSERT
Låt oss säga att vi har en enkel tabell som heter person:
CREATE TABLE person (
person_id BIGINT,
name VARCHAR(255).
age INT,
city VARCHAR(255)
);
Det mest grundläggande inlägget innebär att du sätter in alla värden i tabellen:
INSERT INTO person VALUES (1, 'john doe', 25, 'new york');
Om du bara vill infoga specifika kolumner måste du uttryckligen ange vilka kolumner:
INSERT INTO person (name, age) VALUES ('john doe', 25);
Observera att om det finns några begränsningar på bordet, till exempel INTE NULL, kommer du att behöva inkludera dessa kolumner i båda fallen.
Infoga flera rader
Du kan infoga flera rader i databasen samtidigt:
INSERT INTO person (name, age) VALUES
('john doe', 25),
('jane doe', 20);
Infoga från välj
Du kan infoga data i en tabell som ett resultat av ett valt uttalande:
INSERT INTO person SELECT * FROM tmp_person WHERE age < 30;
Observera att projektorn för markeringen måste matcha de kolumner som krävs för skäret. I detta fall har tmp_person
tabellen samma kolumner som person
.
Infoga data med COPY
COPY är PostgreSQLs bulkinsättningsmekanism. Det är ett bekvämt sätt att överföra data mellan filer och tabeller, men det är också mycket snabbare än INSERT
när du lägger till fler än några tusen rader åt gången.
Låt oss börja med att skapa exempeldatafil.
cat > samplet_data.csv
1,Yogesh
2,Raunak
3,Varun
4,Kamal
5,Hari
6,Amit
Och vi behöver en tabell med två kolumner som dessa data kan importeras till.
CREATE TABLE copy_test(id int, name varchar(8));
Nu själva kopieringsoperationen, detta kommer att skapa sex poster i tabellen.
COPY copy_test FROM '/path/to/file/sample_data.csv' DELIMITER ',';
I stället för att använda en fil på disken kan du infoga data från 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
Du kan också kopiera data från en tabell till fil enligt nedan:
COPY copy_test TO 'path/to/file/sample_data.csv' DELIMITER ',';
För mer information om COPY kan du kolla här
INSERT data och RETURING-värden
Om du infogar data i en tabell med en automatisk inkrementskolumn och om du vill få värdet för kolumnen Autoökning.
Säg att du har ett bord som heter 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)
);
Om du vill infoga data i my_table
och få id för den raden:
INSERT INTO my_table(name, contact_number) VALUES ( 'USER', 8542621) RETURNING id;
Ovanstående fråga returnerar id för raden där den nya posten infogades.
VÄLJ data till fil.
Du kan kopiera tabellen och klistra in den i en fil.
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 ... PÅ KONFLIKT UPPDATERA ...
eftersom version 9.5 postgres erbjuder UPSERT
funktionalitet med INSERT
uttalande.
Säg att du har en tabell som heter my_table, skapad i flera tidigare exempel. Vi sätter in en rad och returnerar PK-värdet för den inlagda raden:
b=# INSERT INTO my_table (name,contact_number) values ('one',333) RETURNING id;
id
----
2
(1 row)
INSERT 0 1
Om vi nu försöker infoga rad med befintlig unik nyckel kommer det att göra ett undantag:
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-funktionalitet ger möjlighet att infoga det ändå och lösa konflikten:
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