Postgresql
添加新列時使用不為空的預設值是否安全?
我們有一個由 Postgresql v11.4提供支持的 Rails 應用程序,我想在其中添加一個具有預設值和非空約束的新列,如下所示:
ALTER TABLE "blogs" ADD "published" boolean DEFAULT FALSE NOT NULL
我知道添加具有預設值的新列是安全的。但是,與 結合使用它仍然安全
NOT NULL
嗎?還是會鎖定數據庫?謝謝!
這種說法是安全的。
ALTER TABLE 永遠不會鎖定“數據庫”,它只會鎖定表。
Postgres 實際上不會重寫表,因為您
false
為預設值提供了一個常量值 ( )。所以添加列實際上是在幾毫秒內完成的,因為 Postgres 只儲存新列可用的資訊。當該列被訪問(並且沒有可用的值)時,它將使用列定義中的預設值。僅當更新行時,新行才會包含該列的實際值。如果預設值是每行可能不同的表達式,Postgres 將重寫表以物理地將預設列放入所有行。但是,這只會鎖定表,而不是數據庫。
來自Postgres 文件
ALTER TABLE
:“當添加了列並指定了ADD COLUMN
非易失性列時,預設值在語句執行時進行評估,結果儲存在表的元數據中。該**值將用於所有現有的列行。**如果沒有指定,則使用 NULL。在這兩種情況下都不需要重寫表。DEFAULT``DEFAULT
並在 Postgres v.11 中進行了測試:dbfiddle.uk