2009-09-23 3 views
0

J'ai un problème, je suis en train d'insérer une nouvelle ligne dans une table de base de données Postgres et obtenir l'erreur suivanteImpossible d'insérer une nouvelle ligne dans la table de base de données postgres?

ERROR: duplicate key violates unique constraint "n_clients_pkey" 

Voici ma requête

insert into n_clients(client_name) values('value'); 

J'utilise postgres 8.1. 11

PostgreSQL 8.1.11 on x86_64-redhat-linux-gnu, compiled by GCC gcc (GCC) 4.1.2 20070626 (Red Hat 4.1.2-14) 

est ici la structure pour ma table

           Table "public.n_clients" 
    Column |   Type   |        Modifiers        
-------------+--------------------------+----------------------------------------------------------------------- 
id   | integer     | not null default nextval(('public.n_clients_id_seq'::text)::regclass) 
client_name | character varying(200) | not null 
moddate  | timestamp with time zone | default now() 
createdate | timestamp with time zone | default now() 
Indexes: 
    "n_clients_pkey" PRIMARY KEY, btree (id) 

et la séquence

Sequence "public.n_clients_id_seq" 
Column  | Type 

--------------- + --------- sequence_name | nom last_value | bigint incrément_by | bigint max_valeur | bigint min_value | bigint valeur du cache | bigint log_cnt | bigint is_cycled | boolean is_appel | boolean

+0

Pouvez-vous ajouter votre commande CREATE TABLE pour la table n_clients. –

+0

J'ai mis à jour ma question, s'il vous plaît jeter un oeil à ma structure de tables – Roland

Répondre

6

Cette ligne existe déjà, vous ne pouvez donc pas l'insérer. Quelle est la clé primaire de votre relation? Est-ce une séquence? Si oui, peut-être qu'il s'est coincé (peut-être vous avez importé des données). Vous devez le réinitialiser manuellement au prochain ID disponible (par exemple, si l'ID maximum est 41, vous devez effectuer les opérations suivantes: SELECT setval ('your_seq', 42);), puis réessayer.

+0

La séquence s'est coincée – Roland

0

Vous devez avoir un UNIQUE constraint sur votre table, que votre insertion enfreint - c'est-à-dire, compte tenu du nom de votre table et index, vous essayez probablement d'insérer un client qui existe déjà dans votre table.

0

Généralement, on se retrouve dans cette situation en ajoutant manuellement un enregistrement avec un champ id qui correspond à la valeur actuelle de la séquence. Il est facile de l'introduire par certaines opérations communes de vidage/rechargement par exemple. J'ai écrit un article sur la correction de ce type d'erreur dans toute la base de données au Fixing Sequences.

0

WTF faites-vous avec la version 8.1 d'il y a un siècle? 8.4 affiche un bien meilleur message d'erreur:

ERREUR: la valeur de la clé en double viole la contrainte unique "master_pkey" DETAIL: La clé (id) = (1) existe déjà.

Questions connexes