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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow