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)
执行此操作的正确方法可能是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)
顺便说一句,使用视图将允许您通过使用其他规则重写UPDATE
s 和DELETE
s来强制执行 AB、BA 配对。