我有两个具有相同模式的表,主键为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 ;
}
答案 0 :(得分:0)
我能想到的最简单的解决方案是在table1
上使用触发器。
请勿使用触发器检查唯一性,因为您无法看到其他用户提供的未提交数据。
而是使用触发器INSERT
将数据导入table2
- 这应该对您要检查的所有列都有唯一约束。
如果将数据插入到table2中已经存在的table1中,则违反了table2上的唯一约束,引发了一个可以在前端捕获的异常。
这种方法的最大优点是它也可以在多用户情况下正常工作,在这种情况下,您的事务无法在table2中看到未提交的数据,但DBMS仍会阻止插入继续(事务将挂起直到另一个交易commit
s或rollback
s。。