【发布时间】:2020-01-10 14:17:28
【问题描述】:
我有这张桌子:
CREATE TABLE STATO_VERS_METODO(
METODO INT NOT NULL,
PROGETTO INT NOT NULL,
VERS NUMBER NOT NULL,
STATO VARCHAR2(20) DEFAULT 'Nuovo' NOT NULL,
NOTA_VERSM VARCHAR2(500),
CONSTRAINT UK_STATO_METODO UNIQUE(METODO, PROGETTO, VERS)
);
如果我插入具有相同唯一键(metodo、progetto、vers)的行,我会收到违反唯一性的错误。此时我想修改已经存在的行并更新“Notes”字段,将 :NEW.NOTE 的值添加到现有的值。 我写了这个触发器:
create or replace TRIGGER AGGIORNA_NOTA_METODO
BEFORE INSERT ON STATO_VERS_METODO
FOR EACH ROW
DECLARE
n_righe INT;
nota VARCHAR2(500);
BEGIN
SELECT COUNT(*) INTO n_righe FROM STATO_VERS_METODO WHERE METODO = :NEW.METODO AND PROGETTO = :NEW.PROGETTO AND VERS = :NEW.VERS;
IF(n_righe > 0)
THEN
IF(:NEW.STATO = 'Modificato')
THEN
SELECT NOTA_VERSM INTO nota FROM STATO_VERS_METODO WHERE METODO = :NEW.METODO AND PROGETTO = :NEW.PROGETTO AND VERS = :NEW.VERS;
UPDATE STATO_VERS_METODO
SET NOTA_VERSM = nota||CHR(10)||:NEW.NOTA_VERSM WHERE METODO = :NEW.METODO AND PROGETTO = :NEW.PROGETTO AND VERS = :NEW.VERS;
END IF;
END IF;
END;
它给了我违反唯一性的错误并且不更新。 如何修改现有行?
【问题讨论】:
-
前触发器不会停止插入。因此,触发此触发器后,仍会尝试插入。这就是为什么您仍然会收到错误消息。
-
请使用标签下方的
edit按钮编辑您的问题,并包含您遇到的确切错误。谢谢。 -
你刚才说:
If I insert a row with the same unique key (method, project, vers)....。也许您想在更新行时将STATO设置为“Modificato”? -
@dmak2709 让我用一个例子来解释一下:假设我们在表 stato_vers_metodo (1, 1, 10, 'Modificato', 'Source code changed') 中有以下行。我在 stato_vers_metodo (1, 1, 10, 'Modificato', 'Minor fix') 中插入了一个新行,这会导致违反键的唯一约束(metodo、progetto、vers)。所以我无法插入该行,但我想通过将 NOTA_VERSM 字段连接到旧字段来修改现有行,如下所示:(1, 1, 10, 'Modificato', 'Source code changed Minor fix')
标签: oracle plsql database-trigger