Dienstag, Mai 13, 2014

On Update Cascade Foreign Keys in postgres

Oracle unterstützt diese Option nicht, aber der SQL Server kennt sie und postgres auch: die Möglichkeit, einen Foreign Key als ON UPDATE CASCADE zu definieren und dadurch die Änderung eines Primary Keys der Parent Tabelle an die Child Tabelle zu propagieren und die Fremdschlüsselwerte dort entsprechend zu korrigieren:

dbadmin=# create table t_parent (pid int primary key);
CREATE TABLE
dbadmin=# create table t_child (id int primary key, pid int references t_parent on update cascade);
CREATE TABLE
dbadmin=# insert into t_parent(pid) values(1);
INSERT 0 1
dbadmin=# insert into t_child(id, pid) values(1, 1);
INSERT 0 1
dbadmin=# insert into t_child(id, pid) values(2, 1);
INSERT 0 1
dbadmin=# insert into t_child(id, pid) values(3, 1);
INSERT 0 1
dbadmin=# update t_parent set pid = 42 where pid = 1;
UPDATE 1
dbadmin=# select * from t_child;
 id | pid
----+-----
  1 |  42
  2 |  42
  3 |  42
(3 Zeilen)

Ich vermute, die Puristen werden an dieser Stelle einwenden, dass man einen Primary Key grundsätzlich nicht ändert. Und über die Performance solcher kaskadierender Änderungen bei größerem Änderungsvolumen will ich lieber nicht nachdenken - aber in manchen Konstellationen könnte dieses Feature ausgesprochen nützlich sein.

Keine Kommentare:

Kommentar veröffentlichen