2017-06-19 57 views

回答

2

我覺得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旁路檢查。否則,檢查發生。