継承では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を持ってるのと一緒になるですよ。