繁体   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