此问题几乎与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上运行。
答案 0 :(得分:0)
这是由评论中的@a_horse_with_no_name解决的。我在单元表中有一些重复的条目,导致同时插入多个相同的条目,导致错误。主键索引在这里完全没有错,而是暗示我的另一个问题。
添加它作为答案,所以我可以将其标记为已回答。如果@a_horse_with_no_name将提供他自己的答案,我会将其标记为已接受的答案并将其删除。