我可以在条件中使用NOT NULL约束吗?在PostgreSQL中

时间:2011-01-03 18:10:56

标签: sql postgresql

我是PostgreSQL的新手,有什么方法可以让一些元组不能删除,如果某些条件成立?具体来说,假设我有:

表男性(Name_A,专业)

表学生(Names_B,Date_birth)

其中Names_B引用Names_A,我怎样才能确保只有那些Names_A“不可删除”,其Date_birth =“xx / yy / zz”

抱歉,如果我无法清楚地解释它,havnt在DDL中使用NOT NULL约束来发现任何内容。

提前感谢您的帮助!

3 个答案:

答案 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;

一个大表可以运行得更快,因为这将修改查询本身并使用条件重写查询而不是检查每一行。 (如果你打算做很多这类东西,触发器可能会更强大,更容易理解。)