【问题标题】:Trigger at least one of each oracle触发每个预言机中的至少一个
【发布时间】: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 唯一并将其限制为MF
  • 所以你不能插入第一行,除非它是多行插入的一部分(insert ... select ... frominsert all),或者触发器显式检查是否只有一行并允许它不管。这似乎不合理。这是否意味着每个性别的最后一个舞者不能离开你的舞蹈学校?当然,验证夫妻关系会更有意义。

标签: oracle plsql ddl


【解决方案1】:

您的触发器正在检查是否没有其他与您插入的舞者同性的舞者。所以当你插入第三个舞者时,你会得到错误。我认为这不是你想要做的:确保每个性别至少有一个舞者。所以,你的触发器应该:

  1. 检查这不是表格中的第一行
  2. 如果还有其他行,至少有一个应该是不同性别的
  3. 它应该检查“删除”DML,所以当你删除一个舞者时,你必须确保有其他同性的舞者。 这实际上是你想要做的吗?

【讨论】:

    猜你喜欢
    • 2020-03-31
    • 2022-01-13
    • 2014-01-05
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 2011-04-11
    • 2013-10-31
    相关资源
    最近更新 更多