Vous n'êtes pas identifié(e).
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
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
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
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
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