比较:插入触发器的新值

时间:2019-03-19 22:58:16

标签: sql oracle oracle11g triggers database-trigger

我正在尝试建立一个触发器,以检查要插入的行是否在另一个表中。

基本上我的2个表共享一个ID列。 当新行在另一个表中至少不存在一次时,我想防止插入。

我有这个:

create or replace trigger BIM
before insert on TABLE1 
for each row
begin
    if not exists (select 1 from TABLE2 where TABLE2.ID = :new.TABLE1.ID)
then
    raise_application_error(-20634, 'Error');
  end if;
end;

但是我得到了:

PLS-00049: bad bind variable 'NEW.TABLE1'

2 个答案:

答案 0 :(得分:1)

您无需重复表格名称:

create or replace trigger BIM
before insert on TABLE1 
for each row
begin
    if (select 1 from TABLE2 where TABLE2.ID = :new.ID and rownum = 0) is not null
then
    raise_application_error(-20634, 'Error');
  end if;
end;

也就是说,这是一个奇怪的要求。我建议您使用外键约束,但要明确地说“至少一次”。这使我怀疑您的数据模型不好-您缺少某种实体,其中id是该表的主键。

答案 1 :(得分:1)

戈登是对的,在这种情况下,最好使用外键约束。

您的代码存在问题(除了Gordon指出的错误之外)是,与其他几种DBMS(例如Postgres)不同,在Oracle中,您无法在{{1}这样的PL / SQL表达式/语句中使用EXISTS }。它应该是纯SQL语句。

IF

DEMO