一、 what is rowid
每一个表中都有一列rowid(iot除外),每一行的rowid代表了该行在数据库中存储的实际地址,可见rowid的独特及重要程度。
rowid是伪列(pseudocolumn),伪劣的意思是实际上这一列本身在数据字典中并不存在,在查询结果输出时它被构造出来的。
在操作上它和普通的列也有一些差别:
1. 不能通过desc以及select直接显示出来,除非显式说明
2. rowid不能做表的primarykey
3. 不能对rowid执行dml操作
oracle的伪列还有很多,如:rownum,ora_rowscn,versions_starttime, versions_endtime, versions_xid,versions_operation等,这些列都非常有用,这里暂时不作介绍。
二、主要功能测试
[oracle@rac1 ~]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.4.0 - Production on Mon Jul 6 16:15:34 2009
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
SQL> conn ecc_view/ecc@devdb1
Connected.
SQL> desc test;
Name Null? Type
----------------------------------------- -------- ----------------------------
ID VARCHAR2(10)
1. 数据字典中并不存在伪列
SQL> select TABLE_NAME,COLUMN_NAME from dba_tab_columns where table_name = 'TEST';
TABLE_NAME COLUMN_NAME
------------------------------ ------------------------------
TEST ID
2. select不能直接显示伪列,要显示的说明
SQL> select * from test;
ID
----------
1
2
1
2
SQL> select t.*, rowid from test t;
ID ROWID
---------- ------------------
1 AAAN+8AAEAAAABFAAA
2 AAAN+8AAEAAAABFAAB
1 AAAN+8AAEAAAABHAAA
2 AAAN+8AAEAAAABHAAB
3. rowid不能做为表的主键
SQL> alter table test add constraint pk_t primary key (rowid);
alter table test add constraint pk_t primary key (rowid)
*
ERROR at line 1:
ORA-00904: "ROWID": invalid identifier
4. 不能对rowid执行dml操作
Although you can use theROWID pseudocolumn in theSELECTand WHEREclause of a query, these pseudocolumn values are not actually stored in the database. You cannot insert, update, or delete a value of theROWIDpseudocolumn
SQL> select t.*,rowid from test t;
ID ROWID
---------- ------------------
1 AAAN+8AAEAAAABFAAA
2 AAAN+8AAEAAAABFAAB
1 AAAN+8AAEAAAABHAAA
2 AAAN+8AAEAAAABHAAB
SQL> insert into test (id, rowid) values('7','AAAN+8AAEAAAABHAAC');
insert into test (id, rowid) values('7','AAAN+8AAEAAAABHAAC')
*
ERROR at line 1:
ORA-01747: invalid user.table.column, table.column, or column specification
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9252210/viewspace-608454/ ,如需转载,请注明出处,否则将追究法律责任。