2015-03-31 101 views
0

SO上有很多PostgreSQL繼承問題,但我想澄清一下我的具體情況。假設我有如下表:PostgreSQL中的「Abstract」表(繼承)

CREATE TABLE abstract_person (
    id bigint PRIMARY KEY, 
    ver int NOT NULL, 
    code varchar NOT NULL, 
    id_country bigint NOT NULL, 
    ... 
); 

CREATE TABLE abstract_person_phone (
    id bigint PRIMARY KEY, 
    ver int NOT NULL, 
    phone varchar NOT NULL, 
    id_abstract_person bigint NOT NULL 
); 

CREATE TABLE individual (
    first_name varchar NOT NULL, 
    last_name varchar NOT NULL, 
    ... 
    CONSTRAINT individual_pkey PRIMARY KEY (id), 
    CONSTRAINT individual_id_country_fkey FOREIGN KEY (id_country) REFERENCES country (id), 
    CONSTRAINT individual_unique UNIQUE (code) DEFERRABLE INITIALLY DEFERRED 
) INHERITS (abstract_person); 

將會有更多的繼承表,individual就是一個例子。表abstract_person將不會有史以來被直接寫入。我是正確的如下假設:

  1. 子表不繼承唯一,主鍵和外鍵約束,但我已經解決了通過直接聲明子表上的約束。

  2. 關於在abstract_personabstract_person_phone表之間強制執行參照完整性,我可以通過觸發器來實現。我不能在父表使用觸發器,我不得不將其連接到每一個孩子表,但我可以用一個單一的觸發功能,像這樣:

    CREATE OR REPLACE FUNCTION person_deleted() RETURNS trigger AS $BODY$ 
    BEGIN 
        DELETE FROM abstract_person_phone WHERE id_abstract_person = OLD.id; 
        RETURN OLD; 
    END; 
    $BODY$ LANGUAGE plpgsql; 
    
    CREATE TRIGGER individual_deleted_trigger AFTER DELETE ON individual 
        FOR EACH ROW EXECUTE PROCEDURE person_deleted(); 
    

回答

0

是的,你是完全正確。所有這些約束不是 傳播到子表。 至於觸發器,你可以在你寫的子表上使用它們。你可以在父表上使用一個觸發器來決定在哪個子表中它應該根據一些條件將數據放在插入查詢(或在選擇上檢索)