触发函数检查 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);
使用特殊的 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);
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);
使用特殊的 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);