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 19/10/2009 13:35:52

bemous
Membre

Probleme d'insertion pour un champ auto increment

Bonjour à tous,
j'ai une table maTable (id,name,obs) avec id en serial (définit comme clé primaire). Lorsque je vexu inserer des données avec la requête
"insert into maTable(name, obs) Values('test','test'); insert into maTable(id,name, obs) Values('test1','test'); " j'ai une erreur violation de contrainte d'intégrité sur id tandis que si j'écris la requête insert into maTable(id,name, obs) Values(1,'test','test');insert into maTable(id,name, obs) Values(2,'test2','test'); tout est bon.

Quel est le problème?

Merci d'avance.

Hors ligne

#2 19/10/2009 16:22:01

bemous
Membre

Re : Probleme d'insertion pour un champ auto increment

Bonjour flo,
en fait les 3 paramètres pour 2 valeurs constituent une erreur évidente. Merci de l'avoir relevé. J'ai écrit précisément:

 Insert into matable(name,obs) Values('test1','test');
Insert into matable(name,obs) Values('test2','test2');

et j'ai une erreur:Violation de contrainte sur id.

ensuite je reprend la même requête en précisant le champ id et ses valeurs:

Insert into matable(id,name,obs) Values(1,'test1','test');
Insert into matable(id,name,obs) Values(2,'test2','test2');

Et là c'est bon!

Nota: Les 2 premières requêtes marchent sur mes anciennes version de postgrsql 8.2 et 8.3 mais sur la 8.4 il y a ce message d'erreur signalé ci-dessus.

En principe je n'ai pas besoin de préciser la valeur de id puis que celui ci est en serial.

Quelqu'un a une explication?

Dernière modification par bemous (19/10/2009 16:23:36)

Hors ligne

#3 19/10/2009 17:09:32

gleu
Administrateur

Re : Probleme d'insertion pour un champ auto increment

Quelle est la prochaine valeur de la séquence ? cette valeur est-elle déjà dans la table ? si oui, votre problème est « normal ».

En principe je n'ai pas besoin de préciser la valeur de id puis que celui ci est en serial.

Tout à fait. La valeur de l'id sera la valeur de la séquence + 1. Mais si le résultat de cet addition est déjà dans une ligne de cette table pour la colonne id, vous aurez l'erreur indiquée.


Guillaume.

Hors ligne

#4 19/10/2009 18:38:30

bemous
Membre

Re : Probleme d'insertion pour un champ auto increment

En fait ma table contient déjà des lignes et comme je souhaite ajouter de nouvelles lignes alors j'envoie la requête sans préciser l'id en ces termes:

Insert into matable(name,obs) Values('test1','test');
Insert into matable(name,obs) Values('test2','test2');
Insert into matable(name,obs) Values('test3','test3');
....

Ainsi donc les dernières lignes doivent doivent êtres insérer en prenant l' id précédente +1 ...

Mais ce n'est pas le cas, car j'ai toujours la même erreur.

Et là je ne sait quoi faire...

Hors ligne

#5 19/10/2009 18:54:06

FNo
Membre

Re : Probleme d'insertion pour un champ auto increment

Bonsoir,
Avez-vous essayé en précisant nextval(''my_id_seq") pour le champ id? Votre séquence est-elle à la bonne valeur (comme Guillaume le demandait)?

Hors ligne

#6 19/10/2009 19:00:22

bemous
Membre

Re : Probleme d'insertion pour un champ auto increment

Comment dois-je préciser?
de façon pratique

Hors ligne

#7 19/10/2009 23:17:58

gleu
Administrateur

Re : Probleme d'insertion pour un champ auto increment

Ainsi donc les dernières lignes doivent doivent êtres insérer en prenant l' id précédente +1 ...

Ce n'est pas comme cela que ça se passe, ce serait bien trop long. Il fait valeur de la séquence + 1.

Que donne « SELECT * FROM nom_de_la_sequence; » ?


Guillaume.

Hors ligne

#8 20/10/2009 11:08:45

bemous
Membre

Re : Probleme d'insertion pour un champ auto increment

sequence_name   last_value  start_value increment_by max_value min_value cache_value log_cnt is_cycled is_called
"tarifaire_indtarif_seq" ; 2 ; 1 ; 1 ; 9223372036854775807 ; 1 ; 1 ; 32 ; f ; t

Hors ligne

#9 20/10/2009 13:43:01

FNo
Membre

Re : Probleme d'insertion pour un champ auto increment

Normalement, la requête suivante devrait fonctionner :

Insert into matable(id,name,obs) Values(nextval('tarifaire_indtarif_seq'),'test3','test3');

Hors ligne

#10 20/10/2009 20:09:01

gleu
Administrateur

Re : Probleme d'insertion pour un champ auto increment

Et que donne « SELECT max(id) from matable » ?

SI c'est différent de 2, il faut faire un « SELECT setval(' tarifaire_indtarif_seq'::regclass, la valeur max + 1); ».

Ensuite, les « Insert into matable(name,obs) Values('test1','test'); » doivent fonctionner.


Guillaume.

Hors ligne

#11 21/10/2009 11:51:04

bemous
Membre

Re : Probleme d'insertion pour un champ auto increment

gleu a écrit :

Et que donne « SELECT max(id) from matable » ?

ça donne 25

gleu a écrit :

« SELECT setval(' tarifaire_indtarif_seq'::regclass, la valeur max + 1); »

conduit à 26

et enfin les "Insert into matable(name,obs) Values('test1','test');"  fonctionnent effectivement.

Merci infiniment à tous!

Hors ligne

Pied de page des forums