Recherche…


INSERT de base

Disons que nous avons un tableau simple appelé personne:

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

L'insertion la plus élémentaire consiste à insérer toutes les valeurs dans la table:

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

Si vous souhaitez insérer uniquement des colonnes spécifiques, vous devez indiquer explicitement quelles colonnes:

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

Notez que si des contraintes existent sur la table, telles que NOT NULL, vous devrez inclure ces colonnes dans les deux cas.

Insertion de plusieurs lignes

Vous pouvez insérer plusieurs lignes dans la base de données en même temps:

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

Insérer de select

Vous pouvez insérer des données dans une table à la suite d'une instruction select:

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

Notez que la projection de la sélection doit correspondre aux colonnes requises pour l'insertion. Dans ce cas, la table tmp_person a les mêmes colonnes que person .

Insérer des données en utilisant COPY

COPY est le mécanisme d'insertion en bloc de PostgreSQL. C'est un moyen pratique de transférer des données entre des fichiers et des tables, mais il est également beaucoup plus rapide que INSERT lorsque vous ajoutez plus de quelques milliers de lignes à la fois.

Commençons par créer un fichier de données exemple.

cat > samplet_data.csv

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

Et nous avons besoin d'un tableau à deux colonnes dans lequel ces données peuvent être importées.

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

Maintenant l'opération de copie proprement dite, cela créera six enregistrements dans la table.

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

Au lieu d’utiliser un fichier sur le disque, vous pouvez insérer des données depuis 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

Vous pouvez également copier des données d'une table pour les classer comme suit:

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

Pour plus de détails sur COPY, vous pouvez vérifier ici

INSERT données et valeurs RETURING

Si vous insérez des données dans une table avec une colonne d'incrémentation automatique et si vous souhaitez obtenir la valeur de la colonne d'incrémentation automatique.

Disons que vous avez une table appelée 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)
);

Si vous voulez insérer des données dans my_table et obtenir l'identifiant de cette ligne:

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

La requête ci-dessus renvoie l'identifiant de la ligne où le nouvel enregistrement a été inséré.

SELECT les données dans le fichier.

Vous pouvez copier le tableau et le coller dans un fichier.

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 ... SUR LES CONFLITS, MISE À JOUR ...

depuis la version 9.5, postgres offre la fonctionnalité UPSERT avec l'instruction INSERT .

Disons que vous avez une table appelée my_table, créée dans plusieurs exemples précédents. Nous insérons une ligne, renvoyant la valeur PK de la ligne insérée:

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

INSERT 0 1

Maintenant, si nous essayons d'insérer une ligne avec une clé unique existante, cela générera une exception:

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 fonctionnalité Upsert offre la possibilité de l'insérer quand même, résolvant le conflit:

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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow