snippetsqlMinor
Trigger to create symmetrical rows
Viewed 0 times
symmetricalrowstriggercreate
Problem
I've got a table that describes some relation between two items. The items are referenced by
Table would look somewhat like this:
ID. I'd like to create a trigger, so whenever you create a row (a,b), a symmetrical row (b,a) is created. I've tried creating after trigger, but it exceed stack depth, because it called itself on insert it had within itself. What is the proper way to do it?Table would look somewhat like this:
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);Solution
The right way to do this will probably be to have your application
If stored procedures are not an option, create a view and rewrite inserts against that view so that they affect some other table.
Incidentally, using a view will allow you to enforce your A-B, B-A pairing by also rewriting
INSERT via a stored procedure (or in Postgres a function).If stored procedures are not an option, create a view and rewrite inserts against that view so that they affect some other table.
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);Incidentally, using a view will allow you to enforce your A-B, B-A pairing by also rewriting
UPDATEs and DELETEs using other rules.Code Snippets
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);Context
StackExchange Database Administrators Q#128031, answer score: 5
Revisions (0)
No revisions yet.