2012-04-02 8 views
11

RozważmyPostgres FK przedstawieniu kompozytowy 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) 
); 

Jak mogę utworzyć FK w "bar", który odwołuje się do PK w "foo"?

+2

Btw: typ danych "ABSTIME" jest de-obsługiwany. Zamiast tego należy użyć DATE lub TIMESTAMP. –

Odpowiedz

8

Musisz utworzyć oddzielne klucze obce:

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

Przepraszam, nie wiadomo ... (Powinienem podać nazwy wyróżniające kolumny "created_on", aby ujednoznacznić ... zobacz zaktualizowane pytanie teraz). Czy powyższa inkantacja w schemacie "bar"? Pamiętaj, bar created_on utworzył created_on dla wpisów w pasku, a nie dla foo. – punkish

+0

Zaktualizowałem odpowiedź. Nie wiem do czego służy twój foo_id, dlatego właśnie stworzyłem int. Referencje są dość łatwe, ale może nie rozumiem, co masz na myśli. –

18

Jak mogę utworzyć FK w "bar", który odwołuje się do PK w "foo"?

Przy obecnej strukturze nie można.

Cel odniesienia dla obcego klucza musi być zadeklarowany jako PRIMARY KEY lub UNIQUE. Więc albo to

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

czy to

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

będzie działać jako cel dla bar.foo_id. Następnie pasek będzie miał proste odniesienie.

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

Jeśli chcesz odwołać się do pierwotnego klucza pierwotnie zadeklarowanego w foo, musisz zapisać klucz podstawowy na pasku. Musisz to wszystko przechowywać, a nie jego część. Więc bez modyfikowania foo, możesz zbudować pasek w ten sposób.

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) 
); 
Powiązane problemy