我是PostgreSQL的新手,有什么方法可以让一些元组不能删除,如果某些条件成立?具体来说,假设我有:
表男性(Name_A,专业)
表学生(Names_B,Date_birth)
其中Names_B引用Names_A,我怎样才能确保只有那些Names_A“不可删除”,其Date_birth =“xx / yy / zz”
抱歉,如果我无法清楚地解释它,havnt在DDL中使用NOT NULL约束来发现任何内容。
提前感谢您的帮助!
答案 0 :(得分:1)
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();
答案 1 :(得分:0)
有关创建触发器的信息,请参阅Postgres trigger documentation。听起来你想要一个行级触发器。
“在操作之前触发的行级触发器...可以返回NULL以跳过当前行的操作。这指示执行程序不执行调用触发器的行级操作(插入或修改特定的表格行。“
因此,在您的条件的触发器测试中,并返回null以防止删除,返回触发器行以允许删除继续。
答案 2 :(得分:0)
您可以使用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;
一个大表可以运行得更快,因为这将修改查询本身并使用条件重写查询而不是检查每一行。 (如果你打算做很多这类东西,触发器可能会更强大,更容易理解。)