【问题标题】:How would one go about creating a trigger to delete corresponding tuples from a separate table?如何创建触发器以从单独的表中删除相应的元组?
【发布时间】:2013-04-16 05:00:10
【问题描述】:

例如,您删除了一个表中的一行,它链接到相应表中的条目。此触发器应在从第一个表中删除元组时从第二个表中删除元组(假设它们的外键匹配的位置)。换句话说,级联删除。假装无法将级联删除选项添加到表中。

我正在使用 Oracle/SQL Plus,这是我的尝试:

CREATE OR REPLACE TRIGGER delCascade
    BEFORE DELETE ON student
    REFERENCING OLD AS oldRow
    FOR EACH ROW    
BEGIN
    DELETE FROM taking
    WHERE taking.studentnum = oldRow.studentnum;
END;
/

我不断收到警告:

Warning: Trigger created with compilation errors.

【问题讨论】:

  • 无法获得有关这些编译错误的更多信息?
  • 如果有办法获得更多信息,我不知道。但考虑到它是 Oracle,我可以假设它不会变得更具体。
  • 它将变得更加具体。在收到警告后执行“显示错误”,它会告诉您实际错误及其所在的行号。不过,您在oldRow 之前缺少:

标签: oracle triggers sqlplus


【解决方案1】:

试试这个

CREATE OR REPLACE TRIGGER delCascade
    BEFORE DELETE ON student
    REFERENCING OLD AS oldRow
    FOR EACH ROW    
BEGIN
    DELETE FROM taking
    WHERE taking.studentnum = :oldRow.studentnum;
END;

【讨论】:

  • 嗯,这绝对消除了警告!现在我终于可以测试它是否能按预期工作。您介意详细说明单冒号的作用以及为什么需要它吗?
  • @TheRationalist,这里您正在访问旧变量值,并且在 oracle 中所有绑定变量,新旧限定符必须以 :
  • 有谁知道在这种情况下我使用BEFORE DELETEAFTER DELETE 是否会有所不同?
【解决方案2】:

给定一个

STUD(rollno, name, birthdate)
RESULT(rollno, marks)

1) 如果学生记录被删除,则编写一个触发器,从RESULT 表中删除所有相关记录。

create or replace trigger del_trg
after delete on stud_trg
for each row
begin
    if deleting then
        delete from result where stud_trg.rollno=result.rollno;
    end if;
end;    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    相关资源
    最近更新 更多