插入 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;
首先,我创建一个 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;