【发布时间】:2022-01-20 11:04:09
【问题描述】:
我有一个名为 movie_cast 的表。
SQL> select * from movie_cast;
ACT_ID MOV_ID ROLE
---------- ---------- --------------------------------------------------
101 901 John Scottie Ferguson
102 902 Miss Giddens
103 903 T. E. Lawrence
104 904 Michael
105 905 Antonio Salieri
106 906 Rick Deckard
107 907 Alice Harford
108 908 McManus
109 909 J. J. Gittes
110 910 Eddie Adams
111 911 Alvy Singer
112 912 San
113 913 Adny Dufresne
114 914 Lester Burnham
115 915 Rose DeWitt Bukater
116 916 Sean Maguire
117 917 Ed
118 918 Renton
119 919 Alfred Borden
120 920 Elizabeth Darko
121 921 Older Jamal
122 922 Ripley
114 923 Bobby Darin
23 rows selected.
此表已经有重复值(#114)。 act_id, mov_id 是外键。我在 movie_cast 表上创建了一个触发器,名为 trg1。
SQL> CREATE OR REPLACE TRIGGER trg1
2 after INSERT ON MOVIE_CAST
3 FOR EACH ROW
4 DECLARE
5 num NUMBER;
6 BEGIN
7 SELECT COUNT(act_ID)
8 INTO num
9 FROM movie_cast
10 WHERE mov_ID=:NEW.mov_ID;
11 if(num >= 1) then
12 dbms_output.put_line('Already cast assigned,same Actors cant cast more than once');
13 end if;
14 END;
15 /
Trigger created.
虽然创建了触发器,但执行后却显示一些错误
(SQL> insert into movie_cast values(124, 921, 'abc');
insert into movie_cast values(124, 921, 'abc')
*
ERROR at line 1:
ORA-04091: table PROJECT_MOVIE_DATA.MOVIE_CAST is mutating, trigger/function may not see it
ORA-06512: at "PROJECT_MOVIE_DATA.TRG1", line 4
ORA-04088: error during execution of trigger 'PROJECT_MOVIE_DATA.TRG1')
我的任务是:我想允许此表中的条目,即;一个演员可以做不止一部电影(act_id 可以重复/重复),但我不能为同一部电影两次演员。 有人可以在这里帮助我吗? 从过去的两天开始,我已经厌倦了这个问题! 谢谢!
【问题讨论】:
-
已经有tons of questions regarding the "is mutating" error。但是你为什么不只使用一个唯一的约束呢?而且你为什么想要这个限制呢?演员可能在一部电影中扮演多个角色,至少在“现实世界”中是这样。
-
您不能像这样使用触发器来检查其父表。对于这种事情,请尝试查看表约束。
-
我这样做是因为我想引发自定义错误(您可以在触发器语句第 12 行看到这一点)。我的任务是为此构建触发器或存储过程。这就是我不使用 UNIQUE 约束的原因。
-
你能帮忙吗?!