2012-04-02 71 views
11

考慮Postgres的FK引用複合PK

CREATE TABLE foo (
    id SERIAL, 
    foo_created_on ABSTIME, 
    foo_deactivated_on ABSTIME, 
    PRIMARY KEY (id, foo_created_on) 
); 

CREATE TABLE bar (
    id SERIAL, 
    bar_created_on ABSTIME, 
    bar_deactivated_on ABSTIME, 
    foo_id REFERENCES (.. what goes here? ..), 
    PRIMARY KEY (id, bar_created_on) 
); 

如何在引用中的 「富」 的PK 「欄中的」 創建FK?

+2

Btw:「ABSTIME」數據類型是不支持的。您應該使用DATE或TIMESTAMP。 – 2012-04-02 22:36:02

回答

8

你必須創建單獨的外鍵:

CREATE TABLE bar (
    id SERIAL, 
    bar_created_on ABSTIME, 
    bar_deactivated_on ABSTIME, 
    foo_id INT, 
    FOREIGN KEY (foo_id, created_on) REFERENCES foo (id, created_on), 
    PRIMARY KEY (id, bar_created_on) 
); 
+0

對不起,不清楚...(我應該給「created_on」列的獨特名稱以消除歧義......現在查看更新後的問題)。上面的「酒吧」模式咒語?請記住,bar的created_on跟蹤條目條目的created_on,而不是foo條目。 – punkish 2012-04-02 21:31:52

+0

我更新了答案。我不知道你的foo_id是什麼,因此我只是把它作爲int。參考文獻很容易,但也許我不明白你的意思。 – 2012-04-02 22:11:57

18

如何在引用中的「富」的PK「欄中的」創建FK?

與您目前的結構,你不能。

外鍵引用的目標必須聲明爲PRIMARY KEY或UNIQUE。因此,無論這個

CREATE TABLE foo (
    id SERIAL PRIMARY KEY, 
    foo_created_on ABSTIME, 
    foo_deactivated_on ABSTIME, 
    UNIQUE (id, foo_created_on) 
); 

或本

CREATE TABLE foo (
    id SERIAL, 
    foo_created_on ABSTIME, 
    foo_deactivated_on ABSTIME, 
    PRIMARY KEY (id, foo_created_on), 
    UNIQUE (id) 
); 

將工作作爲bar.foo_id目標。然後吧有一個簡單的參考。

CREATE TABLE bar (
    id SERIAL, 
    bar_created_on ABSTIME, 
    bar_deactivated_on ABSTIME, 
    foo_id REFERENCES foo (id), 
    PRIMARY KEY (id, bar_created_on) 
); 

如果要引用最初在foo中聲明的主鍵,則必須將該主鍵存儲在bar中。你必須存儲它的全部,而不是它的一部分。所以,如果不修改foo,你可以像這樣建立條形圖。

CREATE TABLE bar (
    id SERIAL, 
    bar_created_on ABSTIME, 
    bar_deactivated_on ABSTIME, 
    foo_id INTEGER NOT NULL, 
    foo_created_on ABSTIME NOT NULL, 
    FOREIGN KEY (foo_id, foo_created_on) REFERENCES foo (foo_id, foo_created_on), 
    PRIMARY KEY (id, bar_created_on) 
);