插入 oracle 时 Rowid 不按顺序 table

Rowid not in order when insert into an oracle table

首先,我创建一个 table

create table TEST
(
  id   VARCHAR2(11),
  name VARCHAR2(11)
)
tablespace USERS
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );

然后我插入,删除,插入一些数据,然后看结果:

truncate table test;
insert into test values (1,1);
commit;
insert into test values (2,1);
commit;
insert into test values (3,1);
commit;
delete test where id = 2;
commit;
insert into test values (4,1);
commit;
insert into test values (5,1);
commit;
insert into test values (6,1);
commit;
delete test where id = 5;
commit;
insert into test values (7,1);
commit;
insert into test values (8,1);
commit;
insert into test values (9,1);
commit;

select t.*, t.rowid from TEST t

然后我可以看到查询结果是:

"ID","NAME","ROWID"
"1","1","AAAGXqAAEAAAAP+AAA"
"8","1","AAAGXqAAEAAAAP+AAB"
"3","1","AAAGXqAAEAAAAP+AAC"
"4","1","AAAGXqAAEAAAAP+AAD"
"6","1","AAAGXqAAEAAAAP+AAE"
"7","1","AAAGXqAAEAAAAP+AAF"
"9","1","AAAGXqAAEAAAAP+AAG"

可以看到第二行是8,但是我在7之后插入了8,它应该出现在7之后。看来rowid的顺序是与插入顺序不同。 所以在我的真实项目中,我插入了最后一条数据,但最后没有出现,而是跳到中间space,然后我的客户找不到最后一条数据。 我的问题是,插入数据时不能保证rowid的顺序,对吗?还是必须加一个order字段?

不要依赖 ROWID,因为它可以更改。例如,如果您导出架构然后将其导入回来,ROWID 可能会改变 - 如果您的代码依赖于(错误的)假设它是 constant - 代码将中断并且你会有问题。

使用其他东西作为标识符和值对 table 中的行进行排序。比如一个序列。

SQLtable 没有内部顺序,因为当 Oracle 执行您的查询时,它可以自由地以任何顺序 return 记录。对结果集进行排序的方法是在查询中添加 ORDER BY 子句,例如

SELECT t.*, t.rowid
FROM TEST t
ORDER BY t.ID;