【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

 

posted @ 2022-01-29 19:14  逆火狂飙  阅读(155)  评论(0)    收藏  举报
生当作人杰 死亦为鬼雄 至今思项羽 不肯过江东