簡體   English   中英

我可以在條件中使用NOT NULL約束嗎? 在PostgreSQL中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM