1、rowid是一个伪列,是用来确保表中行的唯一性,它并不能指示出行的物理位置,但可以用来定位行。
2、rowid是存储在索引中的一组既定的值(当行确定后)。我们可以像表中普通的列一样将它选出来。
3、利用rowid是访问表中一行的最快方式。
4、rowid需要10个字节来存储,显示为18位的字符串。
rowid的组成结构为:
data object number(6位字符串) relative file number(3位字符串) block number(6位字符串) row number(3位字符串),如:AAANS3AABAAAPPqAAA
5、我们可以借助oracle提供的包dbms_rowid,来对rowid进行解析从而获取关于行的相关信息:
SQL>select
2 rowid,
3 dbms_rowid.rowid_object(rowid) obj_id,
4 dbms_rowid.rowid_relative_fno(rowid) df#,
5 dbms_rowid.rowid_block_number(rowid) blknum,
6 dbms_rowid.rowid_row_number(rowid) rowno
7 from t;
一般来说,当表中的行确定后,rowid就不会发生变化。
但当如下情况发生时,rowid将发生改变:
1、对一个表做表空间的移动后
2、对一个表进行了EXP/IMP
rowid的实际应用
在Oracle中如何利用Rowid查找和删除表中的重复记录
现看看我的一个简单表的内容:
如果我利用命令:delete from t2 where a='zongjun';的话,两行内容将全部删掉,而我想删掉其中的一行内容呢?
查看表的rowid:
利用不同的rowid删除指定的行:
这样我们就删掉了重复的内容,请记住rowid是完全不一样的。
但是这样只能适合数据少的表,但是在大型的数据库当中,一个表可能有上千万行的内容,因此我们不可能一条一条的去查找并且删除。我们可以利用min(rowid)或max(rowid)来保留一条重复的内容,删除其余所有的重复内容;如下表
SQL> select * from tt;
        ID NAME
---------- --------
         1  zzj
         2  wang
         3  li
         1  zzj
         1  zzj
         1  zzj
         1  zzj
         1  gang
         1  gang
以上有很多内容是相同的,现在要删除完全一样的内容,各自保留一行即可:
SQL> delete from tt where tt.rowid not in (select min(rowid) from tt group by id,name);
5 rows deleted.
SQL> select * from tt;
        ID NAME
---------- --------
         1 zzj
         2 wang
         3 li
         1 gang
5行已被删除,但是现在还有id一样的行,要保留一行,如下
SQL> delete from tt where tt.rowid not in (select min(rowid) from tt group by id);
1 row deleted.
SQL> select * from tt;
        ID NAME
---------- --------
         1 zzj
         2 wang
         3 li
其中的min(rowid)可以换成max(rowid),这样将会保留最大的rowid,而删除其他的。这里只能利用函数min和max保留最大或者最小的。
 

转载于:https://blog.51cto.com/tech110/168025

oracle中的rowid--伪列-删除表中的重复内容-实用相关推荐

  1. oracle 查询不同编号的时间最小记录_投稿 | ORACLE amp; PostgreSql 利用伪列删除完全重复的两行...

    作者:缪晓丽 DBA.数据库爱好者.从业10年.对 DB2.PostgreSQL.Oracle 均有较长的运维经验. 本次演示的 test 表如下: 01 Oracle 的 rowid SQL 语句: ...

  2. php删除表中一行数据,mysql如何删除表中一行数据?

    mysql中使用DELETE语句删除表中一行数据,语句为"DELETE FROM 表名称 WHERE 列名称 = 值".删除所有行的语句为"DELETE FROM tab ...

  3. python脚本:向表中插入新数据,删除表中最旧的数据

    一张表存储历史数据,最多存储HISTORY_TABLE_MAX_ROWS条数据,当表中数据未达到HISTORY_TABLE_MAX_ROWS,直接插入:如果达到的话需要保证插入新数据的时候将最旧的数据 ...

  4. oracle 如何删除表列,Oracle中增加,修改,删除表中的列

    内核对TCP REUSEPORT的优化 Q&A 当有人问起我关于reuseport的一些事的时候,我们的对话基本如下:Q1:什么是reuseport?A1:reuseport是一种套接字复用机 ...

  5. SQL的删除语句delete(删除表中的数据)

    从一个表中删除数据,使用DELETE语句,有两种使用DELETE的方式: 1.从表中删除特定的行  ,注意不要省略WHERE子句 2.从表中删除所有行 DELETE  FROM  Customers ...

  6. MySQL 插入、更新与删除表中数据

    文章目录 ↠前言↞ ↻ . 准备工作 1)使用数据库 2)创建数据表 3)查看数据表是否存在 4)查看数据表信息 (两种方法) ㊀ . 插入数据 第一种添加方法 第二种添加方法 第三种添加方法 第四种 ...

  7. Oracle中ROWNUM伪列和ROWID伪列的用法与区别

    做过Oracle分页的人都知道由于Oracle中没有像MySql中limit函数以及SQLServer中的top关键字等,所以只能通过伪列的方式去满足分页功能,在此,不谈分页方法,只从根本上去介绍这两 ...

  8. oracle删除表某一字段,oracle中删除表中某字段出现重复的信息 保留其中一条

    记得以前有个同事问过我这个,说是以前面试的时候碰到的问题,下面我介绍三种方法. 首先我们在这里创建一个测试表添加相应的测试数据. create table test  (id number,name ...

  9. Oracle如何删除表中重复记录

    1  引言 在对数据库进行操作过程中我们可能会遇到这种情况,表中的数据可能重复出现,使我们对数据库的操作过程中带来读诸多不便,那么怎么删除这些重复没有用的数据呢? 平时工作中可能会遇到当试图对库表中的 ...

最新文章

  1. 服务器挖chia用什么系统,Chia是什么?Chia挖矿服務器配置
  2. Angular2.x-主/细节组件
  3. 探讨OSPF次优路由选择
  4. C++ stl库 手写 源码分析
  5. 软件测试可用性常用指标
  6. 简单个人静态HTML网页设计作品 DIV布局个人介绍网页模板代码 DW个人网站制作成品 web网页制作与实现
  7. lpb.wifi index.php,lpb(法国lpb是什么品牌)
  8. 宇宙简史——星光中有什么秘密?
  9. c51单片机扩展64K的RAM
  10. 手撸架构,MyBatis 面试42问
  11. Windows远程桌面实现物理机访问控制虚拟机2-Tomcat发布网页
  12. 有哪些实用的图片去水印的方法?这三个方法让你实现去图片水印
  13. 计算机程序 申请专利,计算机程序能申请专利吗
  14. 很经典的十五句话,从别人的blog上看来的!
  15. Error unpacking rpm package initscripts解决方案
  16. 断言(assertion)的简介
  17. iPhone开发之SQLite 实现中文排序的教程
  18. 如何自己动手为家庭做一套安防监控系统
  19. SSL握手过程实例抓包分析
  20. 关于Windows10系统启用SMB文件共享支持服务

热门文章

  1. Django框架restful序列化组件get/post请求接口设计
  2. 利用sqlmap对网站进行sql注入检测
  3. 【推荐】iOS汉字转拼音第三方库
  4. 【ZJOI2013】k大数查询 BZOJ 3110
  5. 这种吉他演奏方式,太牛了啊
  6. 打开一个解决方案时弹出“项目所需的应用程序未安装,确保已安装项目类型(.csproj)的应用程序”问题的解决方案
  7. Android AutoWrapTextView 解决中英文排版问题
  8. 解决svn uuid变更问题
  9. go get 获取被墙依赖包解决方法
  10. 有关ubuntu16.04进行sudo apt-get update更新时出现:‘。。。N: 无法安全地用该源进行更新,所以默认禁用该源。。。’等问题解决方案