Гарантирует ли INSERT RETURNING возврат вещей в «правильном» порядке? - PullRequest
17 голосов
/ 26 марта 2011

Пример:

create table foo(
    id serial, 
    txt text
);

insert into foo(txt) values ('a'),('b'),('c') returning id;

Возвращает:

 id 
----
  1
  2
  3
(3 rows)

кажется , что first id в возвращаемом значении всегда будет id для 'a', вторым для 'b' и так далее, но это определенное поведение insert into, или это совпадение, которое может потерпеть неудачу при странных обстоятельствах?

Ответы [ 3 ]

16 голосов
/ 26 марта 2011

Я не вижу ничего в документации , которая гарантирует заказ на RETURNING, так что я не думаю, что вы можете зависеть от этого.Скорее всего, ордер RETURNING будет соответствовать ордеру VALUES, но я не вижу никаких гарантий относительно того, в какой ордер будет вставлен VALUES;VALUES почти наверняка будут вставлены по порядку слева направо, но опять же, нет никакой документированной гарантии.

Кроме того, реляционная модель устанавливается на основе того, что упорядочивание применяется пользователем, а не пользователем.неотъемлемое свойство отношения.В общем случае, если нет способа явно указать порядок, подразумеваемого порядка нет.

Выполнить сводку: порядок, который вы видите, вероятно, будет всегда, но это не гарантировано, поэтомузависит от этого.

10 голосов
/ 17 января 2015

Хотя документация не совсем понятна, в ней действительно говорится, что:

Если команда INSERT содержит предложение RETURNING, результат будет аналогичен результату оператора SELECT, содержащего столбцы изначения, определенные в списке RETURNING, вычисленные по строке (строкам), вставленной командой.

Теперь «похоже на» не является железной гарантией, и я поднял это дляобсуждение списка рассылки ... но на практике PostgreSQL не будет связываться с порядком значений в RETURNING.Маловероятно, что мы когда-либо сможем это сделать, даже если захотим для оптимизации, потому что слишком много приложений полагаются на то, что они упорядочены так же, как и входные данные.

Итак ... для INSERT INTO ... VALUES (...), (...), ... RETURNING ... и для INSERT INTO ... SELECT ... ORDER BY ... RETURNING ... следует с уверенностью предположить, что отношение результата находится в том же порядке, что и входные данные.

4 голосов
/ 26 марта 2011

Хотя это вам не поможет сейчас , 9.1 будет включать "доступные для записи общие табличные выражения" .Это официальное название для синтаксиса WITH .( Википедия .)

Эта новая способность должна позволить вам поместить INSERT ... RETURNING в WITH, дать псевдоним, а затем SELECT против этого с определенным порядком спростой старый ORDER BY пункт.

...