Oracle数据库--------------------------------数据伪列ROWID

关于Oracle数据库的学习记录:

二十七、数据伪列ROWID
在进行表中数据保存的时候,除了用户可以见到的数据列之外,所有表中的数据行都会有一个唯一的物理地址编号,这种编号就可以通过ROWID查到
范例:观察ROWID
SELECT ROWID,deptno,dname,loc FROM dept;

下面以"AAAR3qAAEAAAACHAAA"ROWID为例介绍一下它的组成
**数据的对象编号:AAAR3q
**数据保存文件编号:AAE
**数据保存的快好:AAAACH
**数据的保存行号:AAA

范例:利用ROWID找出记录
SELECT * FROM dept WHERE ROWID='AAAR3qAAEAAAACHAAA';
一定要记住:任何情况下,都可以通过ROWID确定唯一的一行记录

面试题:请将表中的重复记录只保存一条
有一张数据表,由于最初的设计漏洞并且在使用之也没有进行一些合理的验证,导致表中出现了大量的重复记录信息,题目准备如下:
范例:将dept表复制为mydept表
CREATE TABLE mydept AS SELECT * FROM dept;
范例:在mydept表里面增加一系列的重复数据
INSERT INTO mtdept(deptno,dname,loc) VALUES(10,'ACCOUNTING','NEW YORK');
INSERT INTO mtdept(deptno,dname,loc) VALUES(10,'ACCOUNTING','NEW YORK');
INSERT INTO mtdept(deptno,dname,loc) VALUES(10,'ACCOUNTING','NEW YORK');
INSERT INTO mtdept(deptno,dname,loc) VALUES(30,'SALES','CHICAGO');
INSERT INTO mtdept(deptno,dname,loc) VALUES(30,'SALES','CHICAGO');
将重复的记录删除掉只剩一行,并且只保留最早增加的一行记录
现在思考一下,如果是你做的系统,那么ROWID一定是属于增长的状态,那么最早增加的ROWID的内容一定是最小的,那么应该换一个思路,能不能求出每种信息最小的ROWID?
范例:将mydept表进行分组,按照deptno,dname,loc进行分组
SELECT deptno,dname,loc,MIN(ROWID)
FROM mydept
GROUP BY deptno,dname,loc;
现在已经知道了偶有的最小的ROWID,那么就表示这些ROWID是要保留的数据
范例:执行删除操作,以ROWID为条件,子查询里面一定返回多行单列,使用WHERE子句判断,同时使用IN
DELETE FROM mydept WHERE ROWID NOT IN(
       SELECT MIN(ROWID)
       FROM mydept
       GROUP BY deptno,dname,loc);
ROWID最大的作用是维护一行记录唯一的编号

猜你喜欢

转载自blog.csdn.net/amuist_ting/article/details/80669960