gpt4 book ai didi

SQL RAISE EXCEPTION 不起作用

转载 作者:行者123 更新时间:2023-11-29 14:09:44 25 4
gpt4 key购买 nike

我的 SQL 不是很好,我的代码有一个小问题。

    CREATE OR REPLACE FUNCTION cancelBooking() RETURNS TRIGGER AS $cancelBooking$
BEGIN
IF (NEW.bookingid not in(SELECT bookingid FROM flightbooking)) THEN
RAISE EXCEPTION 'ID NOT FOUND';
END IF;
END;
$cancelBooking$ LANGUAGE plpgsql;

CREATE TRIGGER cancelBooking BEFORE UPDATE ON flightbooking
FOR EACH ROW EXECUTE PROCEDURE cancelBooking();




UPDATE flightbooking
SET status = 'C'
WHERE bookingid=11;

在我用不存在的 ID 更新航类预订后,它仍然显示 UPDATE 0,这当然没有做任何事情,但我希望它是一个错误而不是成功的查询。有任何想法吗?我试图在互联网上寻找解决方案,但没有帮助。

最佳答案

显然,所陈述的问题是为什么它不起作用(这是由于其他答案中讨论的问题。显然这永远不会起作用,因为触发触发器的唯一情况永远不会出现在快照中,其中一行具有与 NEW 相同的 bookingid 的将在同一快照中可见。

此外,我不是 100% 确定,但我担心您的功能的性能。 (PLPGSQL 有时有点滑稽)。

试试这个,因为它更清楚引擎盖下发生的事情,因此更清楚可以优化的内容。

    CREATE OR REPLACE FUNCTION cancelBooking() RETURNS TRIGGER AS 
$cancelBooking$
BEGIN
PERFORM * FROM flightbooking WHERE bookingid = NEW.bookingid;
IF NOT FOUND THEN
RAISE EXCEPTION 'ID NOT FOUND';
END IF;
END;
$cancelBooking$ LANGUAGE plpgsql;

我猜测在大多数情况下,性能差异将非常小,但性能影响和注意事项更加清晰,因此搬起石头砸自己脚的机会更少。

寻求真正的解决方案而不是批评和诊断

这将永远不会像您所做的那样起作用。您可以改为执行以下操作:

CREATE OR REPLACE FUNCTION cancelBooling(_bookingid int) returns void
LANGUAGE PLPGSQL AS
$$
BEGIN
DELETE FROM flightbooking WHERE bookingid = _bookingid;
IF NOT FOUND THEN
RAISE EXCEPTION 'NOT FOUND';
END IF;
END;
$$;

关于SQL RAISE EXCEPTION 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43848521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com