postgresql
INSERIRE
Ricerca…
INSERIMENTO di base
Diciamo che abbiamo una tabella semplice chiamata persona:
CREATE TABLE person (
person_id BIGINT,
name VARCHAR(255).
age INT,
city VARCHAR(255)
);
L'inserimento più semplice comporta l'inserimento di tutti i valori nella tabella:
INSERT INTO person VALUES (1, 'john doe', 25, 'new york');
Se si desidera inserire solo colonne specifiche, è necessario indicare esplicitamente quali colonne:
INSERT INTO person (name, age) VALUES ('john doe', 25);
Nota che se esistono dei vincoli sulla tabella, come NOT NULL, ti verrà richiesto di includere tali colonne in entrambi i casi.
Inserimento di più righe
È possibile inserire più righe nel database contemporaneamente:
INSERT INTO person (name, age) VALUES
('john doe', 25),
('jane doe', 20);
Inserisci da selezionare
È possibile inserire dati in una tabella come risultato di un'istruzione select:
INSERT INTO person SELECT * FROM tmp_person WHERE age < 30;
Si noti che la proiezione della selezione deve corrispondere alle colonne richieste per l'inserimento. In questo caso, la tabella tmp_person
ha le stesse colonne di una person
.
Inserisci i dati usando COPY
COPY è il meccanismo di inserimento di massa di PostgreSQL. È un modo conveniente per trasferire dati tra file e tabelle, ma è anche molto più veloce di INSERT
quando si aggiungono più di qualche migliaio di righe alla volta.
Iniziamo creando un file di dati di esempio.
cat > samplet_data.csv
1,Yogesh
2,Raunak
3,Varun
4,Kamal
5,Hari
6,Amit
E abbiamo bisogno di una tabella a due colonne in cui questi dati possono essere importati.
CREATE TABLE copy_test(id int, name varchar(8));
Ora l'operazione di copia effettiva, questo creerà sei record nella tabella.
COPY copy_test FROM '/path/to/file/sample_data.csv' DELIMITER ',';
Invece di usare un file su disco, puoi inserire dati da 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
Inoltre è possibile copiare i dati da una tabella in un file come di seguito:
COPY copy_test TO 'path/to/file/sample_data.csv' DELIMITER ',';
Per maggiori dettagli su COPY puoi controllare qui
INSERISCI i dati e RIPRISTINA i valori
Se si inseriscono dati in una tabella con una colonna di incremento automatico e se si desidera ottenere il valore della colonna di incremento automatico.
my_table
avere una tabella chiamata 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)
);
Se vuoi inserire dati in my_table
e ottenere l'id di quella riga:
INSERT INTO my_table(name, contact_number) VALUES ( 'USER', 8542621) RETURNING id;
La query precedente restituirà l'ID della riga in cui è stato inserito il nuovo record.
SELEZIONA i dati nel file.
Puoi COPIARE la tabella e incollarla in un file.
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 DO UPDATE ...
dalla versione 9.5 postgres offre la funzionalità UPSERT
con la dichiarazione INSERT
.
Supponiamo che tu abbia una tabella chiamata my_table, creata in diversi esempi precedenti. Inseriamo una riga, restituendo il valore PK della riga inserita:
b=# INSERT INTO my_table (name,contact_number) values ('one',333) RETURNING id;
id
----
2
(1 row)
INSERT 0 1
Ora, se proviamo ad inserire una riga con chiave unica esistente, genererà un'eccezione:
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.
La funzionalità Upsert offre la possibilità di inserirla comunque, risolvendo il conflitto:
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