【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 @   逆火狂飙  阅读(145)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
历史上的今天:
2020-01-29 [Oracle/sql]查看当前用户名下有多少表 以及查看表字段信息
2020-01-29 [oracle/Sql]怎样比较两表的差异?
2015-01-29 【Canvas与艺术】红色凯尔特结
2015-01-29 Java环境变量设置
2015-01-29 Win7安装软件,界面上中文显示乱码的解决方案
2014-01-29 【Canvas技法】勾画十二齿斜齿齿轮轮廓
2014-01-29 【Java与排列组合】某年高考选择题:1,3,5,7,9中选两个,0,2,4,6,8中选两个,组成的无重复四位数有几个?
生当作人杰 死亦为鬼雄 至今思项羽 不肯过江东
点击右上角即可分享
微信分享提示