Memo/PostgreSQL/constraint

http://dexlab.net/pukiwiki/index.php?Memo%2FPostgreSQL%2Fconstraint
 

auth_user.useridが消えたら、auth_groupも消える例

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

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-02-12 (金) 01:18:32 (3055d)