Oracle SQL触发器插入/更新
我想我的问题应该很简单。 我只是在学习触发器,我正试图找出一个家庭作业问题。 我有三张桌子, 电影(片名、年份、长度、类型、研究名称、制片人) StarsIn(电影名称,starName) MovieStar(姓名、地址、性别、出生日期) 所以基本上我需要写一个触发器来确保在任何时候,任何出现在StarsIn中的明星也会出现在MovieStar中。我需要为insert和update事件创建触发器 更新: 好的,所以我稍微改变了我的陈述,但我仍然无法理解这一点Oracle SQL触发器插入/更新,sql,database,oracle,Sql,Database,Oracle,我想我的问题应该很简单。 我只是在学习触发器,我正试图找出一个家庭作业问题。 我有三张桌子, 电影(片名、年份、长度、类型、研究名称、制片人) StarsIn(电影名称,starName) MovieStar(姓名、地址、性别、出生日期) 所以基本上我需要写一个触发器来确保在任何时候,任何出现在StarsIn中的明星也会出现在MovieStar中。我需要为insert和update事件创建触发器 更新: 好的,所以我稍微改变了我的陈述,但我仍然无法理解这一点 CREATE OR REPLACE
CREATE OR REPLACE TRIGGER movieTrigger
AFTER UPDATE OR INSERT ON STARSIN
FOR EACH ROW
WHEN(new.STARNAME NOT IN(SELECT "NAME" FROM MOVIESTAR))
BEGIN
INSERT INTO MOVIESTAR("NAME")
VALUES(new.STARNAME)
END;
现在我得到了错误
Error report:
ORA-02251: subquery not allowed here
02251. 00000 - "subquery not allowed here"
*Cause: Subquery is not allowed here in the statement.
*Action: Remove the subquery from the statement.
我刚刚了解到oracle不支持when子句中的子查询。。。
所以我试图用有限的知识来解决这个问题。但如果有人有一个聪明的方法来做这件事,我真的很想知道:-)
再次感谢您的
触发器
应该在(在本例中)任何行的插入
之前触发(当前,对于一次插入的多行,它触发一次)
我建议你读书
最好使用外键约束,以确保出现在表b
中的值出现在表a
中,在这种情况下,表StarsIn
中应该有一个外键
,用于starName
列引用name
,在MovieStar表中创建了语句级触发器。它将为每个insert或update语句触发一次。但是单个insert或update语句可以一次性插入/更新多行。但是,您的代码需要一行,并且假定只插入或更新一行
如果要遵循此路径,您需要的是行级别触发器(“针对每行”)。为什么不使用外键呢?没有理由让这成为一个触发器。这是为了家庭作业。这个链接应该会有帮助,我也遇到了类似的问题。只是一个旁注:在可执行部分(BEGIN..END
)中,您需要使用绑定变量语法引用列,例如值(:new.STARNAME)
。