2012-04-02 6 views
11

ConsiderarePostgres FK riferimento composito 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) 
); 

Come faccio a creare un FK a "bar" che fa riferimento alla PK in "pippo"?

+2

Btw: il tipo di dati "ABSTIME" è disattivato. Dovresti utilizzare invece DATE o TIMESTAMP. –

risposta

8

È necessario creare chiavi esterne distinte:

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

scusa, non chiaro ... (Avrei dovuto dare i nomi distintivi della colonna "created_on" per disambiguare ... vedere la domanda aggiornata ora). L'incantesimo sopra è nello schema "a barre"? Tieni presente che le barre create_on le tracce create_on per le voci della barra, non le voci foo. – punkish

+0

Ho aggiornato la risposta. Non so per cosa fosse il tuo foo_id, quindi l'ho appena creato. I riferimenti sono piuttosto semplici, ma forse non capisco cosa intendi. –

18

Come faccio a creare un FK a "bar" che fa riferimento alla PK in "pippo"?

Con la struttura attuale, non è possibile.

L'obiettivo di un riferimento di chiave esterna deve essere dichiarato PRIMARY KEY o UNIQUE. Quindi, o questo

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

o questo

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

avrebbe funzionato come obiettivo per bar.foo_id. Quindi la barra avrebbe un riferimento semplice.

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

Se si desidera fare riferimento alla chiave primaria dichiarata originariamente in foo, è necessario memorizzare quella chiave primaria nella barra. Devi conservarlo tutto, non parte di esso. Quindi, senza modificare foo, potresti costruire bar come questo.

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) 
); 
Problemi correlati