在现有表sql上创建主键

时间:2013-11-24 08:56:28

标签: mysql sql sql-server postgresql

我有一个以下表格的表格:

   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上创建主键吗?

2 个答案:

答案 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值不同,则必须选择另一个主键(例如,添加标识列并在此列上创建主键)。