触发器,检查两个不同的表中是否存在相同的元组

时间:2014-12-18 10:23:06

标签: sql oracle join triggers

我写了以下代码:

CREATE OR REPLACE TRIGGER CHECK_tuple
BEFORE INSERT ON tableB
FOR EACH ROW
DECLARE IS_JOIN BOOLEAN:=FALSE

BEGIN
    SELECT tableB.column1, tableB.column2,
        CASE
         WHEN IS_JOIN:= FALSE THEN raise_application_error(-20101, 'ERROR.');
         ELSE IS_JOIN:= TRUE
        END AS CHCK_JOIN
FROM tableB 
JOIN tableA 
ON tableB.column1=tableA.column1 AND tableB.column2=tableA.column2;

END;

我必须检查表A中是否有一个元组(t1)退出(带有“元组”,我的意思是表中包含多列的整行)。如果存在,则必须与表B中的t2匹配。在表B中插入元组t2之前,必须激活触发器。如果t1与t2不匹配,则标志IS_JOIN将保持为FALSE,Oracle SQL将给出错误。否则,如果t1等于t2,则IS_JOIN将为TRUE,不执行任何操作。我希望对将在表B中插入的每一行进行“检查”。这是正确的方法吗?如果任务不明确,请询问进一步的信息。

1 个答案:

答案 0 :(得分:0)

做这样的事情的正确方法:

CREATE OR REPLACE TRIGGER test_test_CHECK_tuple
BEFORE INSERT ON tableB
FOR EACH ROW
declare
  v_cnt number(10);
BEGIN
    SELECT count(*)
    into v_cnt
    FROM tableA
    where column1=:new.column1
    and  column2=:new.column2;

  if v_cnt= 0 then
    raise_application_error(-20101, 'ERROR.');
  end if;
END;

:new表示您要插入的值。没有其他方法可以使用这些值。

顺便说一句。由于foreign key已分配给foreign keyprimary key

,因此unique key的工作原理并非如此