PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 05/05/2022 10:29:32

Anntoinee
Membre

Auto incrémentation depuis un fichier CSV

Bonjour,

j'ai créé un site web avec du PHP et une base de données, j'aimerais pouvoir permettre à l'utilisateur d'importer un fichier CSV depuis le site, qui contient les valeurs des colonnes d'une table. Il y a nom, prenom, age... etc. Parmi ces colonnes il y a une clé primaire, ID. J'aimerais qu'elle s'auto incrémente non seulement depuis une commande simple à exécuter, mais également dès lors qu'on ajoute le fichier CSV.

Actuellement, il faut manuellement ajouter l'ID sur le CSV. Ce qui est embêtant, de plus si on ne met pas la colonne ID ou qu'on l'a met sans valeur dans les cases, une erreur apparait comme quoi il manque une colonne/donnée.

Je pense avoir été clair, merci

Hors ligne

#2 05/05/2022 11:13:04

genamiga
Membre

Re : Auto incrémentation depuis un fichier CSV

Bonjour,

Il suffit de choisir le type de colonne SERIAL pour la colonne ID et PostgreSQL créera une séquence.

Dans le fichier CSV, ne pas prendre la colonne ID, PostgreSQL  se charge de tout.

A chaque insertion dans la table ID sera auto-incrémenté.

Hors ligne

#3 05/05/2022 18:52:38

Anntoinee
Membre

Re : Auto incrémentation depuis un fichier CSV

Comment choisit on ce type SERIAL ?

Hors ligne

#4 06/05/2022 01:17:14

rjuju
Administrateur

Re : Auto incrémentation depuis un fichier CSV

Au moment de la création de la table.  Vous pouvez sinon utiliser une séquence explicitement si vous ne pouvez pas recréer la table, ce qui revient au même.  Voir https://docs.postgresql.fr/14/ddl-default.html

Hors ligne

#5 23/05/2022 11:32:19

Anntoinee
Membre

Re : Auto incrémentation depuis un fichier CSV

Malheureusement même avec le SERIAL, la colonne ID ne s'auto incrémente pas, certes c'est le cas lors d'un query simple qui est envoyé, mais si je j'ajoute depuis la copie d'un fichier CSV des valeurs dans la table, soit je ne mets pas la colonne ID dans le CSV et une erreur comme quoi il manque une colonne survient, soit je mets la colonne ID dans le CSV mais sans rien dedans et une erreur comme quoi ID ne peut être NULL apparait.

J'ai remarqué qu'il existe le mode "Generated", c'est possible de demander à incrémenter 1 depuis l'ancienne valeur ? comme une suite, comme "ID-1 +1"

Hors ligne

#6 23/05/2022 12:30:47

rjuju
Administrateur

Re : Auto incrémentation depuis un fichier CSV

Il va falloir beaucoup plus de détails sur ce que vous faites et les erreurs rencontrées, car à priori tout marche comme il faut:

# create table tt(id serial, val text);
CREATE TABLE

# insert into tt (val) select 'line ' || i from generate_series(1, 10) i;
INSERT 0 10

# copy (select val from tt) to '/tmp/tt.dat';
COPY 10

# \! cat /tmp/tt.dat
line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8
line 9
line 10

# truncate tt;
TRUNCATE TABLE

# copy tt(val) from '/tmp/tt.dat';
COPY 10

# table tt;
 id |   val
----+---------
 11 | line 1
 12 | line 2
 13 | line 3
 14 | line 4
 15 | line 5
 16 | line 6
 17 | line 7
 18 | line 8
 19 | line 9
 20 | line 10
(10 rows)

Vous devriez consulter la documentation de COPY pour votre besoin.


J'ai remarqué qu'il existe le mode "Generated", c'est possible de demander à incrémenter 1 depuis l'ancienne valeur ? comme une suite, comme "ID-1 +1"


Non, car cela ne marcherait pas en cas d'insertion concurrente, ce qui est le problème que serial résoud.

Hors ligne

#7 23/05/2022 12:37:07

gleu
Administrateur

Re : Auto incrémentation depuis un fichier CSV

Il ne faut pas avoir la colonne id dans le fichier CSV, l'autoincrémentation ne se faisant que si l'INSERT ou le COPY utilise une valeur par défaut, et cette valeur par défaut n''est utilisée que si on ne précise pas la valeur ou si on indique DEFAULT à la place de la valeur. Donc pas de colonne ID dans le fichier CSV.

Comme on ne précise pas de valeur pour l'ID, il faut le dire à la commande COPY, qu'elle soit au courant que les valeurs de cette colonne manquent. Pour cela, il faut indiquer à la commande COPY la liste des colonnes comprises dans le fichier CSV (donc toutes les colonnes sauf la colonne ID).


Guillaume.

Hors ligne

Pied de page des forums