首批通过分布式安全可靠测评,为关键业务系统打造
OceanBase ROWID 兼容性介绍
更新时间:2026-05-18 09:11
对于 Oracle 数据库而言,ROWID 是标识 Oracle 数据库中表数据的标识符,通过这个定长的 18 个字节的字符,我们可以获取数据对象编号、对应文件编号、块编号、行编号,以达到快速访问特定行数据的目的。 OceanBase 的数据库表为索引组织表,本质上而言,并没有 ROWID 的概念。此处的 ROWID 仅是基于主键表的主键而拼装的字符串而已,对 ROWID 的访问,可还原成对主键的访问。
适用版本
OceanBase 数据库 V3.x 版本。
OceanBase 数据库 ROWID 验证
创建测试表 TEST_TABLE_RANGE_A 在 U_LXL 库中执行如下语句。
obclient > CREATE TABLE "U_LXL"."TEST_TABLE_RANGE_A" ( "ID" NUMBER NOT NULL, "NUM" NUMBER NOT NULL, "DAT" DATE NOT NULL, "STR" VARCHAR2(200 BYTE) NOT NULL, CONSTRAINT "PK_TEST_TABLE_RANGE_A" PRIMARY KEY ("ID", "DAT", "STR") ) PARTITION BY RANGE ("DAT") ( PARTITION "PAR_2023_01" VALUES LESS THAN (TO_DATE(' 2023-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')), PARTITION "PAR_2023_02" VALUES LESS THAN (TO_DATE(' 2023-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')), PARTITION "PAR_2023_03" VALUES LESS THAN (TO_DATE(' 2023-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')), PARTITION "PAR_2023_04" VALUES LESS THAN (TO_DATE(' 2023-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')), PARTITION "PAR_2023_05" VALUES LESS THAN (TO_DATE(' 2023-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')), PARTITION "PAR_2023_06" VALUES LESS THAN (TO_DATE(' 2023-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')), PARTITION "PAR_2023_07" VALUES LESS THAN (TO_DATE(' 2023-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')), PARTITION "PAR_2023_08" VALUES LESS THAN (TO_DATE(' 2023-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')), PARTITION "PAR_2023_09" VALUES LESS THAN (TO_DATE(' 2023-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')), PARTITION "PAR_2023_10" VALUES LESS THAN (TO_DATE(' 2023-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')), PARTITION "PAR_2023_11" VALUES LESS THAN (TO_DATE(' 2023-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')), PARTITION "PAR_2023_12" VALUES LESS THAN (TO_DATE(' 2024-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')), PARTITION "PART_MAX" VALUES LESS THAN (TO_DATE(' 9999-12-31 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) ); Query OK, 0 rows affected (0.071 sec)创建测试表 TEST_TABLE_RANGE_B 在 U_LXL 库中并且表结构与 TEST_TABLE_RANGE_A 完全一致。
两表插入相同的记录。
插入 TEST_TABLE_RANGE_A 执行如下语句。
obclient > INSERT INTO "U_LXL"."TEST_TABLE_RANGE_A" values(1,0,'2023-01-01 00:00:00','a'); Query OK, 1 row affected (0.002 sec)提交插入数据。
obclient > COMMIT; Query OK, 0 rows affected (0.000 sec)插入 TEST_TABLE_RANGE_B 执行如下语句。
obclient > INSERT INTO "U_LXL"."TEST_TABLE_RANGE_B" values(1,0,'2023-01-01 00:00:00','a'); Query OK, 1 row affected (0.004 sec)提交插入数据。
obclient > COMMIT; Query OK, 0 rows affected (0.000 sec)
查询记录的 ROWID 值。
查询 TEST_TABLE_RANGE_A 表的 ROWID 值,执行如下语句。
obclient > SELECT id,rowid FROM "U_LXL"."TEST_TABLE_RANGE_A" WHERE id=1;输出结果如下。
+----+---------------------------------------+ | ID | ROWID | +----+---------------------------------------+ | 1 | *AAEPAQEAwAEAAAARAEANhCjxBQAWVwEAAABh | +----+---------------------------------------+ 1 row in set (0.022 sec)查询 TEST_TABLE_RANGE_B 表的 ROWID 值,执行如下语句。
obclient [SYS]> SELECT id,rowid FROM "U_LXL"."TEST_TABLE_RANGE_B" WHERE id=1;输出结果如下。
+----+---------------------------------------+ | ID | ROWID | +----+---------------------------------------+ | 1 | *AAEPAQEAwAEAAAARAEANhCjxBQAWVwEAAABh | +----+---------------------------------------+ 1 row in set (0.027 sec)
同一表中 ROWID 值的变化。
向 TEST_TABLE_RANGE_A 插入数据,执行如下语句。
obclient > INSERT INTO "U_LXL"."TEST_TABLE_RANGE_A" values(2,0,'2023-05-01 00:00:00',lpad('a',200)); Query OK, 1 row affected (0.005 sec)提交插入数据。
obclient > COMMIT; Query OK, 0 rows affected (0.000 sec)查询 TEST_TABLE_RANGE_A 表的 ROWID 值的变化。
obclient > select id,length(rowid) from "U_LXL"."TEST_TABLE_RANGE_A";输出结果如下。
+----+---------------+ | ID | LENGTH(ROWID) | +----+---------------+ | 2 | 305 | | 1 | 37 | +----+---------------+ 2 rows in set (0.006 sec)
说明
此时,再插入一条数据,OceanBase 数据库的 ROWID 是变长的,同一个表两条记录,一个 ROWID 长 37,另一个值长 305。