好的,我认为我的问题应该是一个简单的问题。 我正在学习触发器,我正在努力找出一个家庭作业问题。 我有三张桌子, 电影(标题,年份,长度,流派,工作室名称,制片人) StarsIn(movieTitle,starName) MovieStar(姓名,地址,性别,出生日期)
所以基本上我需要写一个触发器,以确保在任何时候出现在StarsIn中的任何明星也出现在MovieStar中。我需要为插入和更新事件设置触发器。
更新: 好的,所以我稍微改变了我的陈述,但我仍然无法弄明白
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子句中不支持子查询... 所以我想用有限的知识来解决这个问题。但如果有人有这样做的聪明方法,我真的很想知道: - )。
再次感谢
答案 0 :(得分:1)
您创建了一个语句级触发器。它将为每个插入或更新语句触发一次。但是单个insert或update语句可以一次插入/更新许多行。但是,您的代码只需要一行,并假定只插入或更新了一行。
如果您想要遵循此路径,您需要的是行级触发器(“FOR EACH ROW”)。
答案 1 :(得分:0)
trigger
before
insert
row
b
a
foreign key
当前为StarsIn
starName
name
我建议阅读http://docs.oracle.com/cd/A97630_01/appdev.920/a96590/adg13trg.htm
使用外键约束来确保表MovieStar
中显示的值出现在表{{1}}中总是更好,在这种情况下,您的{{1}}应该是{{1}}列{{1}}的表格{{1}}引用{{1}}表格中的{{1}}