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才能删除其详细信息。如果数据不存在,请停止删除功能并返回错误。我不知道现在该做什么。
答案 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);
使用特殊的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);