Например, когда я использую запрос, который возвращает идентификаторы записей
INSERT INTO projects(name)
VALUES (name1), (name2), (name3) returning id;
Который производит продукцию:
1
2
3
Будут ли эти идентификаторы указывать на соответствующие вставленные значения?
1 -> name1
2 -> name2
3 -> name3
Ответы:
Ответ для этого простого случая - Да . Строки вставляются в указанном порядке в
VALUES
выражении. И если вашid
столбец являетсяserial
типом, значения из базовой последовательности будут выбираться в этом порядке.Но это деталь реализации и нет никаких гарантий. В частности, порядок не обязательно поддерживается в более сложных запросах с
WHERE
условиями или объединениями.Вы также можете смешать пробелы или другие строки, если у вас есть параллельные транзакции, записывающие в одну и ту же таблицу одновременно. Вряд ли, но возможно.
В таблице базы данных нет «естественного» порядка. Хотя физический порядок строк (который отражен в системном столбце
ctid
) изначально будет соответствовать их вставленному порядку, он может измениться в любое время.UPDATE
,DELETE
,VACUUM
И другие команды могут изменить физический порядок строк. Но сгенерированные значения дляid
стабильны и никак не связаны с этим, конечно.источник
serial
столбцом - в идеале в той же транзакции.WHERE
условиями. Хотя я не могу придумать простыхWHERE
условий, которые могли бы изменить порядок строк, объединения, безусловно, могут это сделать.Ответ Эрвина Брандштеттера может быть неверным в определенном случае.
Мы сделали,
INSERT INTO ... SELECT bar,baz FROM foo ORDER BY bar
и мы видим, чтоSELECT ctid,* FROM foo
показывает, что физическое упорядочение строк в таблице не точно соответствует порядку вставки, кажется, немного растерялся. Обратите внимание, что в нашей таблице есть столбец jsonb с сильно меняющимся размером данных. Экспериментальное усечение данных jsonb во время вставки привело к правильному порядку вставки.источник