前項のPK問題

| コメント(0) | トラックバック(0)



継承ではPKチェックを行ってくれないよう。そのかわり、TRIGGERを使うとそれっぽいことができそう:



まず、継承関係を作成。この際、小テーブルでもちゃんとPKを明示的に指定しておかないといけない(インデックスはテーブル毎の指定であって、継承はされない)



CREATE TABLE item_200602 (PRIMARY KEY(id)) INHERITS (item);
CREATE TABLE item_200603 (PRIMARY KEY(id)) INHERITS (item);

このままだとitem_200602とitem_200603に同一キーが存在していても問題なしなので、SELECT * FROM item WHERE id = 1; とかした時に複数の行が返ってくる事がある。なので、ここでトリガーを作成:



CREATE OR REPLACE FUNCTION CheckItemPK ()
RETURNS TRIGGER AS
$func$
BEGIN
IF (EXISTS(SELECT 1 FROM item WHERE id = NEW.id)) THEN
RAISE EXCEPTION 'item with primary key % already exists', NEW.id;
END IF;
RETURN NEW;
END;
$func$
LANGUAGE 'plpgsql';

CREATE TRIGGER CheckItemPKTrigger BEFORE INSERT OR UPDATE ON item_200603
FOR EACH ROW EXECUTE PROCEDURE CheckItemPK();
CREATE TRIGGER CheckItemPKTrigger BEFORE INSERT OR UPDATE ON item_200602
FOR EACH ROW EXECUTE PROCEDURE CheckItemPK();


これで、item_200603とitem_200602はitemのPKにいちいちチェックしないとINSERT/UPDATEができない事になるし、同じsequenceを使うので基本的にSERIAL PRIMARY KEYを持ってるのと一緒になるですよ。


Author

Daisuke Maki (a.k.a lestrrat): Perl hacker, Director of Japan Perl Association, YAPC::Asia Tokyo Organizer (2009-2012), Fluent in Japanese, English. Ex-Brazilian (sorta)

#perl #c #ruby #java #mysql #english #japanese #opensource #stf #cooking #scotch #cigar


このエントリーをはてなブックマ
ークに追加

翔泳社よりモダンPerl入門(2010)を出版させていただいております。できれば内容をアップデートしたいので是非皆様・・・現在の在庫処理にお力をお貸しください!><

月別アーカイブ