0

我有两个具有相同架构的表,并且两者的主键都是 noc,

每当在表 1 中进行插入时,必须在表 2 中检查其 noc,如果存在则必须比较完整行,如果有任何差异,则必须引发异常。如果 noc 在 TABLE2 中不存在,则必须遵循简单的插入

这是我的触发功能

          CREATE OR REPLACE FUNCTION ac_val()
           RETURNS trigger AS
           $BODY$

            BEGIN

           IF NEW.acop IS NULL THEN

                           INSERT INTO exception_detail( noc,exception) 
    VALUES (new.noc,'number cannot be empty');


    END IF;


    RETURN NEW;
           END;
   $BODY$
       LANGUAGE plpgsql VOLATILE

这是我的触发器

             CREATE TRIGGER acut_val
           AFTER INSERT OR UPDATE
             ON acut
          FOR EACH ROW
         EXECUTE PROCEDURE ac_val();

这对于一个表来说是完全可以的,但是现在根据每个插入的要求,它必须检查 noc 是否存在于其他表 TABLE2 中,如果存在则必须进行比较,否则插入

我想我不能对每个插入执行检查,因为要插入 acuit 的数据是从 csv 复制的,这需要从 csv 复制,如果我复制它会给出错误,你必须是超级用户,但如果我从控制台复制就可以了。那么我可以在 acuit 中复制数据后执行类似的操作,逐行检查

             SELECT q1.* FROM acut q1
             INNER JOIN TABLE2 q2 ON (q1.noc = q2.noc);

它将给出存在于 TABLE2 中的 acut 记录

接着

              foreach row of above output{

      if (q1.name != q2.name)
      Do something ;

    if (q2.address < q1.address)
     Do something ;

     } 
4

1 回答 1

0

我能想到的最简单的解决方案是在table1.

不要使用触发器检查唯一性,因为您看不到其他用户未提交的数据。

而是使用触发器INSERT将数据输入table2- 它应该对您要检查的所有列具有唯一约束。

如果将数据插入到 table2 中已经存在的 table1 中,则会违反 table2 上的唯一约束,从而引发可以在前端捕获的异常。

这种方法的一大优点是它也可以在多用户情况下正常工作,在这种情况下,您的事务在 table2 中看不到未提交的数据,但 DBMS 仍会阻止插入继续(事务将挂起,直到另一个commit事务或rollbacks)。

于 2012-10-29T13:08:21.577 回答