我有一个以下表格的表格:
create table tab1(i1 int, i2 character varying);
我想将i1作为主键。但是我的问题是i1列包含重复的行。 为了实现这一目标,我创建了一个以下形式的表:
create table tab2(i1 int, i2 character varying);
insert into tab2 (i1, i2)
(select distinct * from tab1);
alter table tab2 add primary key(i1);
这样做后,我收到以下错误:
NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index "tab2_pkey" for table "tab2"
ERROR: could not create unique index "tab2_pkey"
DETAIL: Key (i1)=(1958) is duplicated.
有人可以帮我在tab2上创建主键吗?
答案 0 :(得分:1)
Key (i1)=(1958) is duplicated.
请运行选择
select distinct * from tab1 where i1 = 1958
并确保在结果中返回多行。 例如,行
| i1 | i2 |
| 1958 | '1' |
| 1958 | '2' |
是不同的,不同的返回2行。如果您确实需要i1上的主键,则必须提供插入的唯一值。试试这个:
insert into tab2 (i1, i2) (select i1, max(i2) from tab1 group by i1);
您可以使用任何聚合代替函数max()。
答案 1 :(得分:1)
在i2中,不能有多个具有相同主键i1和不同值的记录,因为主键应该唯一地标识记录。
在您的情况下,i1 = 1958确定了哪条记录?
如果给定i1的所有i2值都相同,则您有重复记录,并且必须在i1上创建主键之前删除它们,如果给定i1值的某些i2值不同,则必须选择另一个主键(例如,添加标识列并在此列上创建主键)。