在插入之前触发删除记录
Posted
技术标签:
【中文标题】在插入之前触发删除记录【英文标题】:trigger to delete a record before insert 【发布时间】:2017-06-02 18:42:36 【问题描述】:我有一个有 4 列的表格
1.msisdn
2.accountnumber
3.cardnumber
4.subscriptiondate
我想在这个表中添加一个触发器。如果我插入的数据是
1.99999999
2.2
3.3298572857239
4.(this can be blank)
而当前表中的数据是
1.99999999
2.1
3.3298572857239
4.(this can be blank)
触发器应检查是否存在此 msisdn 99999999
是否已具有此卡号 3298572857239
的记录。如果表中已存在记录,则触发器应删除现有条目并插入新条目。最终结果应该是这样的
1.99999999
2.1
3.3298572857239
4.(this can be blank)
我想在触发器之前和之后保持 accountnumber 的值相同。这是我迄今为止尝试过的,但是对于这个触发器,我没有在 accountnumber 列中获得任何数据。请有人帮忙
DROP TRIGGER TRIG_TABLEA;
CREATE OR REPLACE TRIGGER TRIG_TABLEA
BEFORE INSERT ON TABLEA
REFERENCING OLD AS Old NEW AS New
FOR EACH ROW
BEGIN
:new.accountnumber := :old.accountnumber;
DELETE FROM TABLEA WHERE MSISDN = :new.MSISDN AND CARDNUMBER = :new.CARDNUMBER;
:new.MSISDN := :new.MSISDN;
:new.CARDNUMBER := :new.CARDNUMBER;
:new.accountnumber := :old.accountnumber;
END;
/
【问题讨论】:
您需要触发器吗?MERGE 可以成为解决方案吗?另外,到目前为止,您尝试过什么? 我尝试在 msisdn 和 cardnumber 上添加唯一约束,但它不起作用(影响应用程序的功能)。如果它是一个触发器,我认为我们可以避免将多个相同卡号的条目分配给表中的单个 msisdn。 【参考方案1】:不要执行删除和插入操作。你想要MERGE
。您的报表中唯一可以更改的是帐号和订阅日期。你没有说数据来自哪里,所以我假设这是一个以 p_* 作为参数的 PL/SQL 过程。所以你想要这样的东西:
MERGE INTO mytable trg
USING ( SELECT p_accountnumber, p_subscriptiondate FROM dual ) src
ON ( trg.msisdn = p_msisdn AND trg.cardnumber )
WHEN NOT MATCHED INSERT ( msisdn, accountnumber, cardnumber, subscriptiondate )
VALUES ( p_msisdn, p_accountnumber, p_cardnumber, p_subscriptiondate )
WHEN MATCHED SET ( cardnumber = p_cardnumber, subscriptiondate = p_subscriptiondate)
如果该行不存在,这将执行插入,如果存在,则更新现有行。
【讨论】:
数据来自网络服务。它检查 TABLEA 并进行插入。抱歉,我是这方面的初学者。而且我认为我们没有从网络服务获得任何订阅日期的数据,插入将只有帐号、msisdn 和卡号。 因此假设您正在运行一个 PL/SQL 语句,其中 p_msisdn、p_cardnumber、p_accountnumber 和 p_subscriptiondate 是参数。如果您没有收到订阅日期,则可以将其省略。 请当我从 dual 中选择 p_cardnumber 时,它显示标识符无效。 是的,我假设这是在一个存储过程中,其中这些是参数。您不想在触发器中执行此合并(查找“变异表”错误)。这将取代你正在做的任何insert
。以上是关于在插入之前触发删除记录的主要内容,如果未能解决你的问题,请参考以下文章