Postgresql

Postgres 是否保留記錄的插入順序?

  • March 20, 2022

例如,當我使用返回記錄 ID 的查詢時

INSERT INTO projects(name)
VALUES (name1), (name2), (name3) returning id;

哪個產生輸出:

1
2
3

這個 id 會指向相應的插入值嗎?

1 -> name1
2 -> name2
3 -> name3

這個簡單案例的答案是:“是”VALUES行按表達式中提供的順序插入。如果您的id列是一種serial類型,則將按該順序從底層序列中獲取值。

但這是一個實現細節,不能保證。WHERE特別是,在具有條件或連接的更複雜的查詢中,不一定要維護順序。

如果您有並發事務同時寫入同一個表,您也可能會混入間隙或其他行。不太可能,但可能。

數據庫表中沒有“自然”順序。雖然行的物理順序(反映在系統列ctid中)將與它們最初插入的順序相對應,但隨時可能改變。UPDATE, DELETE,VACUUM和其他命令可以改變行的物理順序。對於SELECT任何特定順序的行,您必須添加一個ORDER BY子句。當然, 的值id一旦生成,就會穩定並與任何物理順序解耦。

引用自:https://dba.stackexchange.com/questions/95822