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