Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#1 15/02/2010 17:15:37
- will
- Membre
ERREUR : la valeur d'une clé dupliquée rompt la contrainte unique
Bonjour à tous,
J'ai récemment importé un certain nombre d'enregistrements dans ma table avec un COPY d'un fichier CSV
Dans cette table, chaque enregistrement a un identifiant unique de type SERIAL.
Depuis mon import, lorsque j'essaie d'insérer un nouvel enregistrement (via une interface PHP), j'ai le message d'erreur suivant :
Query failed: ERREUR: la valeur d'une clé dupliquée rompt la contrainte unique « documents_pkey »
J'ai tenté un FULL VACUUM sur ma table, ainsi qu'un REINDEX, mais rien n'y fait ...
Merci d'avance pour votre aide.
Will
Hors ligne
#2 15/02/2010 18:30:31
- SAS
- Membre
Re : ERREUR : la valeur d'une clé dupliquée rompt la contrainte unique
Bonjour,
Ne s'agirait-il pas simplement d'un problème de valeur de la séquence ?
Pourriez-vous nous donner des informations sur la table, la colonne, le type de la colonne utilisée comme clé primaire ?
Stéphane Schildknecht
Conseil, formations et support PostgreSQL
http://www.loxodata.com
Hors ligne
#3 15/02/2010 18:46:32
- will
- Membre
Re : ERREUR : la valeur d'une clé dupliquée rompt la contrainte unique
Bonjour,
Voici les détails :
CREATE TABLE documents
(
iddocument serial NOT NULL,
titre text NOT NULL,
sstitre text,
auteur character varying(100) NOT NULL,
CONSTRAINT documents_pkey PRIMARY KEY (iddocument),
CONSTRAINT documents_iddocument_key UNIQUE (iddocument)
)
WITH (
OIDS=FALSE
);
ALTER TABLE documents OWNER TO will;
La clé primaire est donc iddocument, de type serial.
Dans mon INSERT, je ne mentionne pas cette colonne, de sorte que la valeur retenue soit celle par défaut, à savoir nextval('documents_iddocument_seq'::regclass)
Merci beaucoup.
Will
Hors ligne
#4 15/02/2010 18:58:11
- Marc Cousin
- Membre
Re : ERREUR : la valeur d'une clé dupliquée rompt la contrainte unique
Que vaut la valeur courante de votre sequence ? Est-ce que cette valeur n'existe pas déjà dans la table ?
À mon avis, qui rejoint celui de SAS, vous avez une séquence qui n'est pas initialisée avec une valeur supérieure à la valeur la plus élevée déjà définie dans votre clé primaire.
Pour résoudre le problème, faites :
SELECT max(iddocument) FROM documents;
Vous récupérerez la plus grande valeur de document.
puis
ALTER SEQUENCE documents_iddocument_seq RESTART la_valeur_que_vous_avez_recupere_plus_un
Ca permettra de définir des ids de documents qui ne seront pas en confilt.
Par ailleurs, CONSTRAINT documents_iddocument_key UNIQUE (iddocument) ne sert à rien : iddocument est déjà une Primary Key, donc unique et not null par définition.
Marc.
Hors ligne
#5 16/02/2010 10:42:31
- will
- Membre
Re : ERREUR : la valeur d'une clé dupliquée rompt la contrainte unique
Bonjour Marc,
Merci beaucoup, c'est exactement ça. Je ne savais juste pas comment réinitialiser la séquence ... Maintenant, si ;-)
Merci encore,
Will
Hors ligne