Vous n'êtes pas identifié(e).

#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

Pied de page des forums