我有一个问题,我正在尝试在postgres数据库表中插入一个新行并收到以下错误
ERROR: duplicate key violates unique constraint "n_clients_pkey"
这是我的查询
insert into n_clients(client_name) values( 'value');
我正在使用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)
这是我表格的结构
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)
和序列
Sequence "public.n_clients_id_seq"
Column | Type
--------------- + --------- sequence_name |名称 last_value | BIGINT increment_by | BIGINT max_value | BIGINT min_value | BIGINT cache_value | BIGINT log_cnt | BIGINT is_cycled |布尔 is_called |布尔
答案 0 :(得分:6)
此行已存在,因此无法插入。你们关系的主要关键是什么?这是序列吗?如果是这样,可能会卡住(也许你导入了数据)。您应该手动将其重置为下一个可用的免费ID(例如,如果最大ID为41,您应该执行:SELECT setval('your_seq',42);)然后再试一次。
答案 1 :(得分:0)
你的桌子上必须有一个UNIQUE constraint,你的插件是违反的 - 也就是说,考虑到你的表和索引的名称,你可能正在尝试插入一个已存在于你的表中的客户端。 / p>
答案 2 :(得分:0)
通常,通过手动添加具有与序列的当前值匹配的id字段的记录来进入这种情况。例如,通过一些常见的转储/重载操作很容易引入它。我写了一篇关于在Fixing Sequences整个数据库中纠正这种错误的文章。
答案 3 :(得分:0)
WTF你是在做一个世纪前的8.1版吗? 8.4显示更好的错误消息:
错误:重复键值违反唯一约束“master_pkey” DETAIL:Key(id)=(1)已经存在。
答案 4 :(得分:0)
PostGresSQL 在创建数据库时应该有一个主键,所以你不能添加任何内容,然后只能手动添加数据