我正在尝试建立一个触发器,以检查要插入的行是否在另一个表中。
基本上我的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'
答案 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