在插入之前触发删除记录

trigger to delete a record before insert

我有一个有 4 列的 table

1.msisdn
2.accountnumber
3.cardnumber
4.subscriptiondate

我想为此添加一个触发器 table。如果我插入的数据是

1.99999999
2.2
3.3298572857239
4.(this can be blank)

并且当前在table中的数据是

1.99999999
2.1
3.3298572857239
4.(this can be blank)

触发器应该检查是否有这个 msisdn 99999999 已经有这个卡号 3298572857239 的记录。如果 table 中已经存在记录,则触发器应删除现有条目并插入新条目。最终结果应该是这样的

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。您的报表中唯一可以更改的是帐号和订阅日期。你没有说数据来自哪里,所以我假设这是一个以 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)

如果行不存在,这将执行插入操作;如果存在,则更新现有行。