Postgresql
Postgres 是否保留記錄的插入順序?
例如,當我使用返回記錄 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
一旦生成,就會穩定並與任何物理順序解耦。