【发布时间】:2020-04-13 11:36:02
【问题描述】:
我正在创建一个触发器,以保证每个性别至少有一个舞者。例如,如果我在那张桌子上只有 2 位舞者,那么他们将有一位男性和一位女性
我有这些表
dancers (artistic_name, sex, fnac, real_name)
couples (name1, name2, fnac, times_together)
我的解决原理就是这个触发器
create or replace trigger t_control
before insert or update on dancers
for each row
declare
cnt number;
begin
select count(*) into cnt
from dancers d
where :new.artistic_name != d.artistic_name
and :new.sex = d.sex;
if cnt !=0 then
raise_application_error('-20001', 'Not possible');
end if;
end t_control;
/
但我有一个问题,如果我先输入女性,然后输入男性,其余插入会跳过触发器
对于“至少一个”这个表达你会怎么做?
INSERT INTO dancers VALUES('artistic1', 'm', 'today', 'anna')
INSERT INTO dancers VALUES('artistic2', 'f', 'today', 'paul')
从这里开始,每次插入触发都会跳转
ORA-20001: Not possible
ORA-06512: at "FIDDLE_TQJRRVAQQOICTXMWSHDG.T_CONTROL", line 12
ORA-04088: error during execution of trigger 'FIDDLE_TQJRRVAQQOICTXMWSHDG.T_CONTROL'
INSERT INTO dancers VALUES('artistic3', 'f', 'today', 'mery')
INSERT INTO dancers VALUES('artistic4', 'm', 'today', 'joan')
【问题讨论】:
-
请将测试数据发布为文本 - 而不是图像 - 以及该数据的预期结果。
-
每种类型中的一种是什么意思?
-
@AnkitBajpai 例如,要引入实例,它必须是男性或女性。我举一个我从声明中解释的例子
-
所以你总共只能有两个舞者(表格中的两行)?然后使
sex唯一并将其限制为M或F。 -
所以你不能插入第一行,除非它是多行插入的一部分(
insert ... select ... from或insert all),或者触发器显式检查是否只有一行并允许它不管。这似乎不合理。这是否意味着每个性别的最后一个舞者不能离开你的舞蹈学校?当然,验证夫妻关系会更有意义。