会保留订单吗?

时间:2019-03-21 16:12:42

标签: sql oracle

create table source_table (id number);
insert into source_table values(3);
insert into source_table values(1); 
insert into source_table values(2);

create table target_table (id number, seq_val number);
create sequence example_sequence;

insert into target_table 
select id, example_sequence.nextval
    from 

> (select id from source_table ***order by id***);

是否已正式保证,对于source_table中具有较低值的id,插入到source_table中时,相应序列的值也将较低?换句话说,是否保证插入时会保留 order by 子句提供的排序?

EDIT 问题不在于:“表中的行是否按这样排序?”而是“插入时我们可以依赖子查询中使用的 order by 子句吗?”。

为更进一步说明这一点,在上例中运行target table之类的查询后,上例中select * from target_table order by id的内容为:

ID | SEQ_VAL 1 1 2 2 3 3

此外,如果我在插入时指定降序排列:

insert into target_table 
select id, example_sequence.nextval
    from 

> (select id from source_table ***order by id DESC***);

上面相同查询的输出为: ID | SEQ_VAL 1 3 2 2 3 1

我敢肯定,我已经对其进行了多次测试。我的问题是“我可以一直依靠这种顺序吗?”

1 个答案:

答案 0 :(得分:3)

关系数据库中的

表未排序,并且缺少ORDER BY的游标结果集中的任何明显排序都是数据存储的人工产物,不能保证,并且桌子上的后续操作可能会导致这种明显的顺序发生变化。如果希望以特定方式对游标的结果进行排序,则必须使用ORDER BY