|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : mai 2004 Messages : 24 ![]() |
j'ai décllaré les clé primaires de mes tables en type SERIAL.
En théorie l'auto-incrémentation se fait de la manière suivante: 1.recherche de la clé max dans la table, 2.incrémentation 3.insertion. or j'ai le message d'erreurs suivant: duplicate key violates unique constraint "pk_taxon". A priori l'insertion ne peut pas se faire car la clé primaire du tuple que je veux insérer est similaire à un tuble contenu dans la table. D'où peut venir le problème! |
|
|
00
|
|
|
#2 | ||
|
Expert Confirmé Sénior
![]() ![]() Inscription : mai 2004 Messages : 4 490 ![]() |
Citation:
Citation:
|
||
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : mai 2004 Messages : 24 ![]() |
normalement lors d'une insertion, la clé produite doit avoir une valeur différente de celles existantes. donc il ne devrait pas y avoir ce message d'erreur de clé déjà existante.
|
|
|
00
|
|
|
#4 |
|
Membre habitué
![]() Inscription : avril 2004 Messages : 94 ![]() |
Il serait plus facile de t'aider si tu nous donnait la description de la table et le code d'insertion de ta ligne
|
|
|
00
|
|
|
#5 |
|
Membre habitué
![]() Inscription : avril 2004 Messages : 94 ![]() |
Il serait plus facile de t'aider si tu nous donnait la description de la table et le code d'insertion de ta ligne
|
|
|
00
|
|
|
#6 | ||||
|
Invité de passage
![]() Inscription : mai 2004 Messages : 24 ![]() |
une de mes tables où je veux faire une insertion
Code :
Code :
En sachant que j'ai déjà rempli ma base et donc ma table avec des méta données aussi la clé externe taxe_code_taxon=1 existe! |
||||
|
|
00
|
|
|
#7 | |
|
Expert Confirmé Sénior
![]() ![]() Inscription : mai 2004 Messages : 4 490 ![]() |
Citation:
Code :
duplicate KEY violates UNIQUE constraint "pk_taxon". Mais bon, je pense avoir une idée du problème. Le fait de déclarer un champ de type SERIAL va avoir pour conséquence de créer automatiquement une séquence, c'est à dire une table spéciale qui va avoir pour tâche de conserver la dernière valeur utilisée pour le compteur. Cette table spéciale porte le nom de ton champ suivi de _seq (dans ton cas, ce devrait être CODE_TAXON_seq) A chaque insertion dans une table comportant un champ SERIAL, Postgres consulte la séquence correspondante, incrémente la valeur qu'elle contient et initialise le champ avec, et enregistre le résultat dans la séquence. Tu dis que tu as déjà rempli ta base, comment as-tu fait ? Si tu est passé par une commande COPY FROM, il faut savoir que cette commande ne met pas à jour les séquences. Il faut que ce soit toi qui mettes à jour le compteur, avec la dernière valeur utilisée en utilisant la fonction setval(nom_de_ta_sequence, valeur_du_compteur). Si la dernière valeur de compteur est 56, alors utilise la requête suivante : Attention : comme toutes les autres tables, l'accès aux séquences est réglé par des droits d'accès (GRANT) |
|
|
|
00
|
|
|
#8 | ||
|
Invité de passage
![]() Inscription : mai 2004 Messages : 24 ![]() |
j'ai rempli la base avec des fichiers qui contenaient déjà les clés et en utilisant l'instruction:
Code :
|
||
|
|
00
|
|
|
#9 |
|
Expert Confirmé Sénior
![]() ![]() Inscription : mai 2004 Messages : 4 490 ![]() |
Ca ne change rien à mon explication. Tu peux aussi vérifier la valeur actuelle du compteur en faisant :
|
|
|
00
|
|
|
#10 | ||||
|
Invité de passage
![]() Inscription : mai 2004 Messages : 24 ![]() |
j'ai regardé la table des clés et le numéro courant est de 1
j'ai utilisé l'instruction que tu m'as donné: Code :
ensuite j'ai réessayé l'instruction initiale: Code :
duplicate key violates unique constraint "pk_taxon"............. |
||||
|
|
00
|
|
|
#11 |
|
Expert Confirmé Sénior
![]() ![]() Inscription : mai 2004 Messages : 4 490 ![]() |
Si j'en crois le schéma de ta table, c'est code_taxon qui est de type SERIAL, et non pas taxon_code_taxon (au passage, le choix du nom de tes champs n'est pas très heureux, ce qui explique d'ailleurs ta confusion
Code :
SELECT SETVAL('code_taxon_seq', 3002); |
|
|
00
|
|
|
#12 |
|
Invité de passage
![]() Inscription : mai 2004 Messages : 24 ![]() |
c'est bon j'ai trouvé en fait la valeur 3002 n'était pas la max.
A e propos c'est quoi l'instruction pour trouver la clé max? |
|
|
00
|
|
|
#13 |
|
Invité de passage
![]() Inscription : mai 2004 Messages : 24 ![]() |
c'est bon j'ai trouvé en fait la valeur 3002 n'était pas la max.
A e propos c'est quoi l'instruction pour trouver la clé max? |
|
|
00
|
|
|
#14 |
|
Expert Confirmé Sénior
![]() ![]() Inscription : mai 2004 Messages : 4 490 ![]() |
|
|
|
00
|
|
|
#15 |
|
Invité de passage
![]() Inscription : mai 2004 Messages : 24 ![]() |
merci beaucoup!
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com