create table auth_group ( groupid varchar(40), userid varchar(40) references auth_user(userid) on delete cascade, lock integer default 1, primary key (groupid, userid) );
CREATE TABLE時にCONSTRAINTを指定すると、制約を付けることができる。
親テーブルのある行が削除されたら、それを参照している子テーブルの行も削除される等。
なお、両方のテーブル共に行をユニークに識別できる(プライマリ)キーが設定されている必要がある。
--削除は子から
DROP TABLE child;
DROP TABLE parent;
--親テーブル
CREATE TABLE parent (
id int8 not null,
PRIMARY KEY (id)
);
--子テーブル
CREATE TABLE child (
id int8 not null,
data text,
CONSTRAINT child_fk
FOREIGN KEY(id) REFERENCES parent(id)
ON DELETE CASCADE
ON UPDATE CASCADE,
PRIMARY KEY (id)
);
--データ投入
insert into parent select 1;
insert into parent select 2;
insert into parent select 3;
insert into child select 1, 'data1';
insert into child select 2, 'data2';
insert into child select 3, 'data3';
-- 親にデータが無いのでエラー
insert into child select 4, 'data4';
-- ERROR: child_fk referential integrity violation - key referenced from child not found in parent
--親を消すと子も消える
delete from parent where id = 2;
-- scott=# select * from child;
-- id | data
-- ----+-------
-- 1 | data1
-- 3 | data3
--親のIDを更新すると、子のIDも更新される
update parent set id = 2 where id = 3;
-- scott=# select * from child;
-- id | data
-- ----+-------
-- 1 | data1
-- 2 | data3