Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL触发器插入/更新_Sql_Database_Oracle - Fatal编程技术网

Oracle SQL触发器插入/更新

Oracle SQL触发器插入/更新,sql,database,oracle,Sql,Database,Oracle,我想我的问题应该很简单。 我只是在学习触发器,我正试图找出一个家庭作业问题。 我有三张桌子, 电影(片名、年份、长度、类型、研究名称、制片人) StarsIn(电影名称,starName) MovieStar(姓名、地址、性别、出生日期) 所以基本上我需要写一个触发器来确保在任何时候,任何出现在StarsIn中的明星也会出现在MovieStar中。我需要为insert和update事件创建触发器 更新: 好的,所以我稍微改变了我的陈述,但我仍然无法理解这一点 CREATE OR REPLACE

我想我的问题应该很简单。 我只是在学习触发器,我正试图找出一个家庭作业问题。 我有三张桌子, 电影(片名、年份、长度、类型、研究名称、制片人) StarsIn(电影名称,starName) MovieStar(姓名、地址、性别、出生日期)

所以基本上我需要写一个触发器来确保在任何时候,任何出现在StarsIn中的明星也会出现在MovieStar中。我需要为insert和update事件创建触发器

更新: 好的,所以我稍微改变了我的陈述,但我仍然无法理解这一点

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)