Oracle SQL 触发器

Oracle SQL Trigger

我刚开始编写 PL/SQL 触发器代码。

我有一个图书数据库,其中包含 [Title, Author, Score, Votes, Year] 列。

当我向数据库中插入一本新书时,我想将一本没有年份信息的书设置为 2014,并在标题末尾添加 _changed

CREATE OR REPLACE TRIGGER book_trigger
BEFORE INSERT ON BOOK
FOR EACH ROW
BEGIN
IF :NEW.YR IS NULL THEN :NEW.YR := 2014;
IF :NEW.YR IS NULL THEN :NEW.TITLE := :OLD.TITLE + '_changed'
END IF;
END IF;
END;

我的问题是标题没有添加 _changed

首先,您的第二个 if 条件永远不会是 TRUE,因为您在前一行设置了 :NEW.YR。其次,你的触发器在 BEFORE INSERT 上触发,:OLD.TITLE 将始终是 NULL。我只能建议你想要这样的东西

CREATE OR REPLACE TRIGGER book_trigger
BEFORE INSERT or UPDATE ON BOOK
FOR EACH ROW
BEGIN
    IF :NEW.YR IS NULL 
    THEN 
        :NEW.YR := 2014;
    END IF;
    if updating then
        :NEW.TITLE := :OLD.TITLE || '_changed';
    end if;
END;

注意 updating 标志,它由 oracle 预定义,它告诉我们行现在正在更新,而不是插入,我们只能在 UPDATING 模式下使用 :OLD

如果您真的想更改插入的记录以附加“_changed”,您可以这样做:

CREATE OR REPLACE TRIGGER book_trigger
BEFORE INSERT or UPDATE ON BOOK
FOR EACH ROW
BEGIN
    IF :NEW.YR IS NULL 
    THEN 
        :NEW.YR := 2014;
        :NEW.TITLE := :OLD.TITLE || '_changed';
    end if;
END;
/

根据@agent5566 的建议,您可以考虑不对插入执行此操作,而仅在更新时执行此操作。