【oracle】清除重复项后再设定主键
假设有这样一张没有事先设定主键的表:
create table test( id number(12) )
这样给它填充数据:
insert into test(id) values (1); insert into test(id) values (2); insert into test(id) values (2); insert into test(id) values (3); insert into test(id) values (4); insert into test(id) values (5); insert into test(id) values (6);
现在test表的id字段就有重复记录了,它现在就可以当作模拟环境了。
现在想给id字段设置为主键,但明显其中值存在重复项,设置主键Oracle不会允许。
因此我们需要先确认有没有重复项:
SQL> select id from test group by id having count(id)>1; ID ---------- 2
运行结果告诉我们,id为2的行有两条。
SQL> select rowid,id from test where id=2; ROWID ID ------------------ ---------- AAASvQAAHAAACb8AAB 2 AAASvQAAHAAACb8AAC 2
利用rowid,我们可以删去一条。
SQL> delete from test where rowid=(select max(rowid) from test where id=2); 已删除 1 行。
这里是删去一条,因为只有一条重复的,如果是多条就该只保留rowid最大的一条,上面的语句就该改成:
delete from test where rowid!=(select max(rowid) from test where id=2);
好了,既然删去了重复的记录,我们可以设置主键了。
SQL> alter table test add constraint pk_test primary key(id); 表已更改。
END
浙公网安备 33010602011771号