[英]Can i use NOT NULL constraint with a condition? in PostgreSQL
我是PostgreSQL的新手,有什么方法可以使某些元組在某些情況下無法刪除? 具體來說,假設我有:
表男(Name_A,行業)
表學生(姓名_B,出生日期)
在Names_B引用Names_A的地方,如何確保只有那些Names_A是“不可刪除的”,其Date_birth =“ xx / yy / zz”
對不起,如果我無法清楚地解釋這一點,則可以使用NOT NULL約束在DDL中找到任何內容以進行編寫。
先謝謝您的幫助!
CREATE FUNCTION protect_delete() RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
IF OLD.date_birth = 'xx/yy/zz' THEN -- don't actually use this date format
RETURN NULL; -- don't delete
ELSE
RETURN OLD;
END IF;
END;
$$;
CREATE TRIGGER protect_delete BEFORE DELETE ON students FOR EACH ROW
EXECUTE PROCEDURE protect_delete();
有關創建觸發器的信息,請參見Postgres觸發器文檔 。 聽起來您想要行級觸發器。
“在操作之前觸發的行級觸發器...可以返回NULL以跳過當前行的操作。這指示執行程序不執行調用該觸發器的行級操作(特定表的插入或修改)行)。
因此,在針對您的條件的觸發器測試中,返回null以防止刪除,請返回觸發器行以允許刪除繼續。
您可以使用PostgreSQL規則:
create rule rule_test as
on delete to test
-- old is a reference to your table
where old.birth = '2011-1-1' -- or whatever condition you want
do instead nothing;
一個大表可能會運行得更快,因為這將修改查詢本身並使用條件重寫查詢,而不是檢查每一行。 (如果您打算做很多此類事情,則觸發器可能更強大,更易於理解。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.