触发以创建对称行

Mat*_*ock 5 postgresql trigger database-design

我有一个表格,描述了两个项目之间的某种关系。项由 引用ID。我想创建一个触发器,所以每当你创建一行时(a,b),就会创建一个对称的行(b,a)。我试过在触发器之后创建,但它超过了堆栈深度,因为它在插入时调用了它自己。什么是正确的方法呢?

表看起来有点像这样:

CREATE TABLE MY_RELATION(
ID SERIAL,
THING1 INT NOT NULL,
THING2 INT NOT NULL,
PRIMARY KEY (ID)
);

CREATE TABLE MY_THING(
ID SERIAL,
VAL INT NOT NULL
PRIMARY KEY(ID)
);
ALTER TABLE MY_RELATION ADD FOREIGN KEY (THING1) REFERENCES MY_THING(ID);
ALTER TABLE MY_RELATION ADD FOREIGN KEY (THING2) REFERENCES MY_THING(ID);
Run Code Online (Sandbox Code Playgroud)

Chr*_*ton 5

执行此操作的正确方法可能是INSERT通过存储过程(或在 Postgres 中的函数)让您的应用程序。

如果存储过程不是一个选项,请创建一个视图针对该视图重写插入,以便它们影响其他一些表。

 CREATE TABLE t (
     a integer,
     b integer
 );
 CREATE VIEW v AS SELECT t.a, t.b FROM t;
 CREATE RULE mirror AS
    ON INSERT TO v DO INSTEAD
    INSERT INTO t (a, b) VALUES (new.a,new.b), (new.b,new.a);
Run Code Online (Sandbox Code Playgroud)

顺便说一句,使用视图将允许您通过使用其他规则重写UPDATEs 和DELETEs来强制执行 AB、BA 配对。