如何重置postgres'主键索引,如果它不同步

时间:2015-10-13 14:11:57

标签: postgresql

此问题几乎与How to reset postgres' primary key sequence when it falls out of sync?类似,但我没有使用序列,因此不适用解决方案。

我有一个像这样创建的表:

create table contact (
  name varchar(256) null,
  phone_number varchar(256) constraint phone_number_id primary key,
  email varchar(256) null,
  unit_id int not null references unit(id)
);

以前有很多内容,我用

截断了它
truncate contact cascade;

现在,尝试输入新数据,前两个进入正常:

> select * from contact;
       name       | phone_number  |          email          | unit_id 
------------------+---------------+-------------------------+---------
 ETUNIMI SUKUNIMI | PUHELIN       | SÄHKÖPOSTI              |       1
 J P              | +3584053xx285 | j.p@xxxxxxxxxxxxxxxxxxx |       2
(2 rows)

但现在我收到关于第三个错误的错误(可能在截断之前存在):

> insert into contact(name, email, phone_number, unit_id)
  select 'S S','s.s@xxxxxxx', '+35840xxxx781', id from unit where name = 'Piiritoimisto';
ERROR:  duplicate key value violates unique constraint "phone_number_id"
DETAIL:  Key (phone_number)=(+35840xxxx781) already exists.

如何告诉PostgreSQL重置约束?我将来需要重复这个过程,并指导其他人这样做(数据可能有问题),所以我不想只是禁用约束。

我已经尝试了

REINDEX index phone_number_id;
REINDEX table contact;

但他们没有帮助。还试过COMMIT;,它说没有交易。

PostgreSQL版本9.3.9,在Ubuntu上运行。

1 个答案:

答案 0 :(得分:0)

这是由评论中的@a_horse_with_no_name解决的。我在单元表中有一些重复的条目,导致同时插入多个相同的条目,导致错误。主键索引在这里完全没有错,而是暗示我的另一个问题。

添加它作为答案,所以我可以将其标记为已回答。如果@a_horse_with_no_name将提供他自己的答案,我会将其标记为已接受的答案并将其删除。