PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Postgres FK verweist auf Composite PK

Mit Ihrer derzeitigen Struktur können Sie das nicht.

Das Ziel einer Fremdschlüsselreferenz muss entweder PRIMARY KEY oder UNIQUE deklariert werden. Also entweder das

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

oder diese

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

würde als Ziel für bar.foo_id funktionieren. Dann hätte bar eine einfache Referenz.

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

Wenn Sie auf den Primärschlüssel verweisen möchten, den Sie ursprünglich in foo deklariert haben, müssen Sie diesen Primärschlüssel in bar speichern. Sie müssen alles speichern, nicht einen Teil davon. Ohne foo zu modifizieren, könnten Sie bar so bauen.

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