检查数据的触发函数是否存在于表中

时间:2015-04-21 02:04:36

标签: database postgresql exception triggers plpgsql

CREATE TRIGGER id_check BEFORE DELETE ON CUSTOMER
    FOR EACH ROW EXECUTE PROCEDURE check_id();


CREATE FUNCTION check_id() RETURNS trigger AS 
$$ BEGIN
    IF (SELECT * FROM Customer WHERE Customer.CustomerID = $1) IS NULL THEN
        rollback transaction;
        print "error "
END$$ 
LANGUAGE plpgsql;

我想在删除之前创建一个SQL触发器函数来检查表中是否存在数据。我必须插入客户ID才能删除其详细信息。如果数据不存在,请停止删除功能并返回错误。我不知道现在该做什么。

1 个答案:

答案 0 :(得分:0)

您的方法存在的问题是,如果找不到行,则永远不会触发触发器。语法提示:FOR EACH ROW。另一方面,触发器FOR EACH STATEMENT无法查看受影响的行或触发语句。赶上22。

您可以将DELETE本身封装在函数或DO语句中:

在那里你可以RAISE一个异常,它会回滚当前的事务,除非在异常处理程序中被捕获:

CREATE FUNCTION delete_from_customer(int)
  RETURNS void AS 
$func$
BEGIN
   DELETE FROM customer WHERE customerid = $1;
   IF NOT FOUND THEN
      RAISE EXCEPTION 'DELETE failed: id % not found in table "customer"', $1;
   END;
END
$func$ LANGUAGE plpgsql;

呼叫:

SELECT delete_from_customer(1);

SQL Fiddle.

使用特殊的plpgsql变量FOUND作为便宜的方式来执行此操作 More about raising errors in the manual.

或者你想要这个?

你的问题不是很清楚。你可能想要完全不同的东西:

  

我必须插入一个客户ID才能删除其详细信息。

验证行是否存在DELETE的条件:

DELETE FROM customer_detail cd
WHERE  customerid = 123
AND    EXISTS (SELECT 1 FROM customer WHERE customerid = cd.customerid);