无法在postgres数据库表中插入新行?

时间:2009-09-23 11:01:55

标签: php postgresql

我有一个问题,我正在尝试在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 |布尔

5 个答案:

答案 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 在创建数据库时应该有一个主键,所以你不能添加任何内容,然后只能手动添加数据