比较同一数据库中两个不同表之间的数据

时间:2012-10-29 12:15:32

标签: postgresql

我有两个具有相同模式的表,主键为noc,两者都是

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

进行简单插入

这是我的触发功能

          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);

它将给出表2中存在的acut记录

然后

              foreach row of above output{

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

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

     } 

1 个答案:

答案 0 :(得分:0)

我能想到的最简单的解决方案是在table1上使用触发器。

请勿使用触发器检查唯一性,因为您无法看到其他用户提供的未提交数据。

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

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

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