日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle rowid and postgresql ctid

發布時間:2024/5/14 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle rowid and postgresql ctid 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先介紹一下oracle rowid,數據庫表行中的物理標識 SQL> select rowid from book_info where rownum<=1;
ROWID ------------------ AAAQTJAAaAAAAoaAAA

ROWID的格式如下:

數據對象編號??????? 文件編號??????? 塊編號?????????? 行編號
OOOOOO???????????? FFF ? ? ? ? ? ? BBBBBB ? ? ? ? ?RRR

由此看出,AAAQTJ是數據對象編號,AAa是文件編號,AAAAoa是塊編號,AAA是行編號

select rowid ,

substr(rowid,1,6) "OBJECT",

substr(rowid,7,3) "FILE",

substr(rowid,10,6) "BLOCK",

substr(rowid,16,3) "ROW"

from book_info where rownum<=5;

查出64位編碼的值:

ROWID ? ? ? ? ? ? ?OBJECT ? ? FILE ? ? ? BLOCK ? ? ?ROW

------------------ ---------- ---------- ---------- ------------------------------------------------------

AAAQTJAAaAAAAoCAAB AAAQTJ ? ? AAa ? ? ? ?AAAAoC ? ? AAB

AAAQTJAAaAAAAoCAAC AAAQTJ ? ? AAa ? ? ? ?AAAAoC ? ? AAC

AAAQTJAAaAAAAoCAAD AAAQTJ ? ? AAa ? ? ? ?AAAAoC ? ? AAD

AAAQTJAAaAAAAoCAAE AAAQTJ ? ? AAa ? ? ? ?AAAAoC ? ? AAE

AAAQTJAAaAAAAoCAAF AAAQTJ ? ? AAa ? ? ? ?AAAAoC ? ? AAF

查出10進制的值:

SQL> select dbms_rowid.rowid_object(rowid) ?object_id, dbms_rowid.rowid_relative_fno(rowid) file_id,

? ? ? ? dbms_rowid.rowid_block_number(rowid) ?block_id ,dbms_rowid.rowid_row_number(rowid) ?num from book_info where ? ? ? ? ? ? rownum<=5;


?OBJECT_ID ? ?FILE_ID ? BLOCK_ID ? ? ? ?NUM

---------- ---------- ---------- ----------

? ? ?66761 ? ? ? ? 26 ? ? ? 2568 ? ? ? ? ?0

? ? ?66761 ? ? ? ? 26 ? ? ? 2568 ? ? ? ? ?1

? ? ?66761 ? ? ? ? 26 ? ? ? 2568 ? ? ? ? ?2

? ? ?66761 ? ? ? ? 26 ? ? ? 2568 ? ? ? ? ?3

? ? ?66761 ? ? ? ? 26 ? ? ? 2568 ? ? ? ? ?4

獲取rowid函數:

create or replace function get_rowid

(l_rowid in varchar2)

return varchar2

is

ls_my_rowid ? ? varchar2(200); ? ? ? ? ?

rowid_type ? ? number; ? ? ? ? ?

object_number ? ? number; ? ? ? ? ?

relative_fno ? ? number; ? ? ? ? ?

block_number ? ? number; ? ? ? ? ?

row_number ? ? number;?

begin

?dbms_rowid.rowid_info(l_rowid,rowid_type,object_number,relative_fno, block_number, row_number); ? ? ? ? ?

?ls_my_rowid := 'Object# is ? ? ?:'||to_char(object_number)||chr(10)||

? ? ? ? 'Relative_fno is :'||to_char(relative_fno)||chr(10)||

? ? ? ? 'Block number is :'||to_char(block_number)||chr(10)||

? ? ? ? 'Row number is ? :'||to_char(row_number);

?return ls_my_rowid ;

end; ? ? ? ??

/


select get_rowid(rowid) from book_info where rownum<=1;

Object# is ? ? ?:66761

Relative_fno is :26

Block number is :2586

Row number is ? :0

當然最常用的是用rowid去除重復:

查出重復數據:

select a.rowid,a.* from 表名 a?

where a.rowid !=?

(

? ?select max(b.rowid) from 表名 b?

? ?where a.字段1 = b.字段1 and?

? ?a.字段2 = b.字段2?

)

刪除重復數據:

delete from 表名 a?

where a.rowid !=?

(

? ?select max(b.rowid) from 表名 b?

? ?where a.字段1 = b.字段1 and?

? ?a.字段2 = b.字段2?

)

對于整行都重復的那么,可以使用distinct函數。


以下介紹下postgresql的ctid

testuser=# select ctid,* from t1 limit 1;

?ctid ?| ? ? a ? ??

-------+-----------

?(0,1) | 100000000

和oracle rowid類似也是一個物理字段,自動生成,不過結構和oracle rowid不一樣,可以看到是(blockid,itemid)

ctid在數據更改后也會變化。


利用ctid去除重復數據:

建立測試表,插入數據:

testuser=# create table t2 (id int,name varchar(20));

CREATE TABLE

testuser=# insert into t2 values (1,'apple');

INSERT 0 1

testuser=# insert into t2 values (1,'apple');

INSERT 0 1

testuser=# insert into t2 values (1,'apple');

INSERT 0 1

testuser=# insert into t2 values (2,'orange');

INSERT 0 1

testuser=# insert into t2 values (2,'orange');

INSERT 0 1

testuser=# insert into t2 values (2,'orange');

INSERT 0 1

testuser=# insert into t2 values (2,'orange');

INSERT 0 1

testuser=# insert into t2 values (3,'banana');

INSERT 0 1

testuser=# insert into t2 values (3,'banana');

INSERT 0 1


testuser=# select * from t2;

?id | ?name ?

----+--------

? 1 | apple

? 1 | apple

? 1 | apple

? 2 | orange

? 2 | orange

? 2 | orange

? 2 | orange

? 3 | banana

? 3 | banana

查詢重復的數據:

testuser=# select ctid,* from t2 where ctid in (select min(ctid) from t2 group by id);

?ctid ?| id | ?name ?

-------+----+--------

?(0,1) | ?1 | apple

?(0,4) | ?2 | orange

?(0,8) | ?3 | banana

刪除重復數據并查看結果:

testuser=# delete from t2 where ?ctid not in (select min(ctid) from t2 group by id);

DELETE 6

testuser=# select * from t2;

?id | ?name ?

----+--------

? 1 | apple

? 2 | orange

? 3 | banana

(3 rows)

總結

以上是生活随笔為你收集整理的oracle rowid and postgresql ctid的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。