Oracle SQL Trigger插入/更新

时间:2013-05-04 19:43:55

标签: sql database oracle

好的,我认为我的问题应该是一个简单的问题。 我正在学习触发器,我正在努力找出一个家庭作业问题。 我有三张桌子, 电影(标题,年份,长度,流派,工作室名称,制片人) 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子句中不支持子查询... 所以我想用有限的知识来解决这个问题。但如果有人有这样做的聪明方法,我真的很想知道: - )。

再次感谢

2 个答案:

答案 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}}