我們假設我有一個表Clients(ID,Name,Phone)
,裏面有幾行,其中一些在«Phone»列中是空的。在postgresql中添加新約束會檢查之前添加的行嗎?
如果我決定在«Phone»列中的表中添加一個新的NOT NULL
約束,PostgreSQL是否會檢查已經在表中的行,還是隻對在約束之後添加的行起作用宣言 ?
我們假設我有一個表Clients(ID,Name,Phone)
,裏面有幾行,其中一些在«Phone»列中是空的。在postgresql中添加新約束會檢查之前添加的行嗎?
如果我決定在«Phone»列中的表中添加一個新的NOT NULL
約束,PostgreSQL是否會檢查已經在表中的行,還是隻對在約束之後添加的行起作用宣言 ?
我覺得documentation是相當清楚的:
SET/DROP NOT NULL
這些形式改變一個列是否標記爲允許空值或 拒絕空值。當列 不包含空值時,只能使用SET NOT NULL。
所以,使用這種形式,你不能在沒有檢查以前的值的情況下添加這樣的約束。
如果使用add table_constraint
,那麼你可以使用CHECK
cosntraint做同樣的事情:
ADD table_constraint [NOT VALID]
這種形式增加了使用相同的語法一個新的約束,表作爲 CREATE TABLE,加上選項NOT VALID,目前只有 允許使用外鍵和CHECK約束。如果約束條件爲 ,則標記爲「無效」,則會跳過可能較長的初始檢查以驗證表中所有行滿足約束條件。對於後續插入或 更新(即,除非 引用表中存在匹配的行(如果是外鍵),它們將失敗,並且它們將失敗,除非 新行匹配指定的檢查約束)。但數據庫 不會假定該約束對於表中的所有行都成立, 直到通過使用VALIDATE CONSTRAINT選項進行驗證。
因此,您不能使用alter table
添加NOT NULL
約束。你可以使用CHECK
做基本相同的事情。然後,您使用NOT VALID
旁路檢查。否則,檢查發生。