Postgresql 使用触发器维护链接表

Postgresql 使用触发器维护链接表,postgresql,Postgresql,我正在考虑使用触发器来维护链接表。但是,由于外键约束冲突,我的初始方法失败。有没有办法在不禁用约束的情况下解决问题 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

我正在考虑使用触发器来维护链接表。但是,由于外键约束冲突,我的初始方法失败。有没有办法在不禁用约束的情况下解决问题


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

这里是。

插入后使用,因为插入前使用失败,因为foo中的父行还不存在。

您如何知道要链接到新的foo记录的bar记录?它来自“插入bar”子句的“将id返回到bar\u id”。当我将BEFORE更改为AFTER时,根本不会调用触发器函数。对我来说很有用。插入后是否进行了提交?谢谢