触发函数检查 table 中是否存在数据

Trigger function to check data exists in the table or not

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 = ) IS NULL THEN
        rollback transaction;
        print "error "
END$$ 
LANGUAGE plpgsql;

我想创建一个 SQL 触发器函数来检查 table 中是否存在删除前的数据。我必须插入客户 ID 才能删除其详细信息。如果数据不存在,则停止删除功能并return 报错。我现在不知道该怎么办。

您的方法存在的问题是,如果未找到任何行,则永远不会触发触发器。语法提示: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 = ;
   IF NOT FOUND THEN
      RAISE EXCEPTION 'DELETE failed: id % not found in table "customer"', ;
   END;
END
$func$ LANGUAGE plpgsql;

致电:

SELECT delete_from_customer(1);

SQL Fiddle.

使用特殊的 plpgsql 变量 FOUND 作为执行此操作的廉价方法。
More about raising errors in the manual.

或者你想要这个?

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

I have to insert a customer ID to delete its detail.

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

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