PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

PK composito di riferimento Postgres FK

Con la tua struttura attuale, non puoi.

La destinazione di un riferimento di chiave esterna deve essere dichiarata 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)
);

funzionerebbe come target per bar.foo_id. Quindi la barra avrebbe un semplice riferimento.

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 vuoi fare riferimento alla chiave primaria che hai originariamente dichiarato in foo, devi memorizzare quella chiave primaria in bar. Devi archiviare tutto, non parte di esso. Quindi, senza modificare foo, potresti creare una barra come questa.

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 (id, foo_created_on),
    PRIMARY KEY (id, bar_created_on)
);