PostgreSQL触发器函数cust_id附近语法错误排查与功能验证
答复
1、现有逻辑有效性判断
你当前写的触发器函数完全无法实现预期的级联删除目标,同时存在多处语法和逻辑错误,直接执行必然报错。
2、错误定位与修复方案
错误点说明
- 直接触发
at or near 'cust_id'报错的原因:SQL的DELETE操作是删除符合条件的整行元组,语法上不需要、也不允许在DELETE关键字后写列名,你写的DELETE cust_id, account_number属于非法语法,数据库解析到cust_id位置就会抛出语法错误。 - 隐藏逻辑错误:在删除类触发器的函数体中,被删除的原行数据存储在特殊记录变量
OLD中,你直接写account.account_number属于无效引用,数据库找不到对应的字段取值,就算修正了DELETE语法也会报字段不存在的错误。 - 缺失必要步骤:你只编写了触发器函数,没有创建将函数绑定到
account表删除事件的触发器,就算函数写对也不会自动执行。
修正后完整代码
首先修正触发器函数:
CREATE OR REPLACE FUNCTION Froehle_13_bankTriggerFunction() RETURNS TRIGGER LANGUAGE plpgsql AS $$ BEGIN -- 直接删除depositor表中匹配被删除账号的所有行,通过OLD获取被删account记录的账号 DELETE FROM depositor WHERE depositor.account_number = OLD.account_number; RETURN OLD; END; $$;
之后执行语句创建绑定到account表的触发器:
CREATE TRIGGER trg_account_delete_depositor_cascade AFTER DELETE ON account FOR EACH ROW EXECUTE FUNCTION Froehle_13_bankTriggerFunction();
补充说明
如果没有强制要求使用触发器实现级联删除,更推荐在创建depositor表的外键时直接添加ON DELETE CASCADE约束,由数据库原生实现级联删除逻辑,性能和稳定性都比自定义触发器更好。
内容的提问来源于stack exchange,提问作者sfroehle
相关产品推荐
相关产品推荐

