Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/06/2004, 11h34   #1
Invité de passage
 
Inscription : mai 2004
Messages : 24
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 24
Points : 0
Points : 0
Par défaut [débutant]auto incrémentation, pb!

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!
ber_jp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2004, 12h44   #2
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
Citation:
D'où peut venir le problème!
Tu as donné toi même la solution

Citation:
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.
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2004, 13h53   #3
Invité de passage
 
Inscription : mai 2004
Messages : 24
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 24
Points : 0
Points : 0
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.
ber_jp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2004, 14h03   #4
Membre habitué
 
Inscription : avril 2004
Messages : 94
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 94
Points : 102
Points : 102
Il serait plus facile de t'aider si tu nous donnait la description de la table et le code d'insertion de ta ligne
GeantVert13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2004, 14h04   #5
Membre habitué
 
Inscription : avril 2004
Messages : 94
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 94
Points : 102
Points : 102
Il serait plus facile de t'aider si tu nous donnait la description de la table et le code d'insertion de ta ligne
GeantVert13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2004, 14h26   #6
Invité de passage
 
Inscription : mai 2004
Messages : 24
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 24
Points : 0
Points : 0
une de mes tables où je veux faire une insertion


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
 
/*==============================================================*/
 
/* Table : TAXON                                                */
 
/*==============================================================*/
 
CREATE TABLE TAXON (
 
CODE_TAXON           SERIAL               NOT NULL,
 
TAX_CODE_TAXON       INT4                 NULL,
 
NOM_LATIN_TAXON      VARCHAR(30)          NOT NULL,
 
NOM_COMMUN_TAXON     VARCHAR(30)          NULL,
 
constraint PK_TAXON PRIMARY KEY (CODE_TAXON),
 
constraint FK_TAXON_TAXON_SUP_TAXON FOREIGN KEY (TAX_CODE_TAXON)
 
   REFERENCES TAXON (CODE_TAXON)
 
   ON DELETE restrict ON UPDATE restrict
 
);
l'insertion:

Code :
1
2
 
INSERT INTO taxon (tax_code_taxon,nom_latin_taxon,nom_commun_taxon) VALUES (1,'toto','tata')\g

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!
ber_jp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2004, 14h55   #7
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
Citation:
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!
Code :
duplicate KEY violates UNIQUE constraint "pk_taxon".
Sachant que le message d'erreur concerne pk_taxon, donc le champ code_taxon, je ne vois pas le rapport avec le champ taxe_code_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 :
Code :
SELECT SETVAL('CODE_TAXON_seq', 56);
Attention : comme toutes les autres tables, l'accès aux séquences est réglé par des droits d'accès (GRANT)
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2004, 15h06   #8
Invité de passage
 
Inscription : mai 2004
Messages : 24
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 24
Points : 0
Points : 0
j'ai rempli la base avec des fichiers qui contenaient déjà les clés et en utilisant l'instruction:

Code :
1
2
 
INSERT INTO taxon VALUES (...............)
ber_jp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2004, 15h16   #9
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
Ca ne change rien à mon explication. Tu peux aussi vérifier la valeur actuelle du compteur en faisant :
Code :
SELECT * FROM CODE_TAXON_seq
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2004, 15h24   #10
Invité de passage
 
Inscription : mai 2004
Messages : 24
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 24
Points : 0
Points : 0
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 :
1
2
 
 SELECT SETVAL('taxon_code_taxon_seq', 3002)\g

ensuite j'ai réessayé l'instruction initiale:
Code :
1
2
 
Hydreco=# insert into taxon (tax_code_taxon,nom_latin_taxon,nom_commun_taxon) values (1,'toto','tata')\g
et toujours la même erreur!
duplicate key violates unique constraint "pk_taxon".............
ber_jp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2004, 15h31   #11
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
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 ). En conséquence, la requête à lancer est celle que je t'ai donnée au départ, soit :
Code :
SELECT SETVAL('code_taxon_seq', 3002);
Tu n'as pas eu de message d'erreur avec le setval que tu as tenté ?
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2004, 15h36   #12
Invité de passage
 
Inscription : mai 2004
Messages : 24
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 24
Points : 0
Points : 0
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?
ber_jp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2004, 15h39   #13
Invité de passage
 
Inscription : mai 2004
Messages : 24
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 24
Points : 0
Points : 0
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?
ber_jp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2004, 16h11   #14
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
Code :
SELECT MAX(CODE_TAXON) FROM TAXON
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2004, 16h25   #15
Invité de passage
 
Inscription : mai 2004
Messages : 24
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 24
Points : 0
Points : 0
merci beaucoup!
ber_jp est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h59.


 
 
 
 
Partenaires

Hébergement Web