Vous n'êtes pas identifié(e).
Pages : 1
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
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
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
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
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
Comment dois-je préciser?
de façon pratique
Hors ligne
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
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
Normalement, la requête suivante devrait fonctionner :
Insert into matable(id,name,obs) Values(nextval('tarifaire_indtarif_seq'),'test3','test3');
Hors ligne
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
Et que donne « SELECT max(id) from matable » ?
ça donne 25
« 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
Pages : 1