SQL触发器疑问:更新Subscription_log时如何通过主键/外键指定行?
触发器更新日志表的行定位问题解决办法
原触发器代码的核心问题:更新Subscription_log时未指定匹配条件,导致执行时会修改日志表的所有行,而非仅对应被更新客户的日志行。针对你的疑问,两种方式的可行性如下:
一、推荐:借助外键Phone_number和Email_address定位行
这是最合理的方案,因为这两个字段是Subscription_log与Subscription_Customer的关联外键,业务逻辑上一一对应。修正后的触发器代码如下:
CREATE OR REPLACE TRIGGER TRIGGER_RENEWAL AFTER UPDATE OF NEXT_RENEW_DATE ON SUBSCRIPTION_CUSTOMER REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW BEGIN UPDATE Subscription_log SET next_renew_date = :NEW.next_renew_date, previous_renew_date = :OLD.next_renew_date WHERE Phone_number = :OLD.Phone_number AND Email_address = :OLD.Email_address; END;
这里用:OLD的外键值即可,因为你仅更新了NEXT_RENEW_DATE,客户的手机号和邮箱并未改动。
二、不推荐:使用rowid定位
rowid是数据库表中每一行的物理标识,Subscription_Customer的rowid和Subscription_log的rowid完全独立,没有关联关系,原代码里的Where rowid = updated row;写法完全错误——你无法直接通过被更新客户的rowid找到对应的日志行。除非你在Subscription_Customer表中额外存储对应日志行的rowid,但这既不符合数据库设计规范,也会增加维护成本,因此不建议采用这种方式。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

