2013-12-09 27 views
0

我正在考虑使用触发器来维护链接表。但是,由于违反外键约束,我的初始方法失败。有没有办法解决这个问题,而不禁用约束?使用触发器来维护链接表


CREATE TABLE foo (
    id SERIAL PRIMARY KEY, 
    data TEXT 
); 
CREATE TABLE bar (
    id SERIAL PRIMARY KEY, 
    data TEXT 
); 
CREATE TABLE foo_bar_link (
    foo_id  INT NOT NULL REFERENCES foo(id), 
    bar_id  INT NOT NULL REFERENCES bar(id), 
    UNIQUE (foo_id, bar_id) 
); 
CREATE OR REPLACE FUNCTION maintain_link() 
RETURNS TRIGGER AS 
$maintain_link$ 
DECLARE 
    bar_id INT; 
BEGIN 
    INSERT INTO bar (data) VALUES ('not_important_for_this_example_bar_data') RETURNING id INTO bar_id; 
    INSERT INTO foo_bar_link (foo_id, bar_id) VALUES (NEW.id, bar_id); 
    RETURN NEW; 
END; 
$maintain_link$ 
LANGUAGE plpgsql; 

CREATE TRIGGER maintain_link BEFORE INSERT ON foo 
    FOR EACH ROW EXECUTE PROCEDURE maintain_link(); 

这里是sqlfiddle

+0

您如何知道链接到新foo记录的条形记录? –

+0

它来自'INSERT INTO bar'子句的'RETURNING ID INTO bar_id'。 –

回答

1

使用AFTER插入,因为使用BEFORE插入失败,因为foo中的父行尚不存在。

+0

当我将BEFORE更改为AFTER时,根本不调用触发器功能。 –

+0

适合我。在INSERT之后你做了COMMIT吗?谢谢。 – mrlindsey