Будет ли заказ на заказ? - PullRequest
2 голосов
/ 21 марта 2019
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 значение соответствующей последовательности также будет ниже при вставке в source_table? Другими словами, гарантируется ли, что сортировка, обеспеченная порядком по предложению , будет сохранена при вставке?

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 Ответ

3 голосов
/ 21 марта 2019

Таблицы в реляционной базе данных не упорядочены, и любое видимое упорядочение в наборе результатов курсора, в котором отсутствует ORDER BY, является артефактом хранения данных, не гарантируется, и последующие действия над таблица может вызвать изменение этого очевидного порядка. Если вы хотите, чтобы результаты курсора были упорядочены определенным образом, вы ДОЛЖНЫ использовать ORDER BY.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...