PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Postgres FK faisant référence à PK composite

Avec votre structure actuelle, vous ne pouvez pas.

La cible d'une référence de clé étrangère doit être déclarée PRIMARY KEY ou UNIQUE. Donc soit ça

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

ou ceci

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

fonctionnerait comme cible pour bar.foo_id. Alors bar aurait une référence simple.

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

Si vous souhaitez référencer la clé primaire que vous avez initialement déclarée dans foo, vous devez stocker cette clé primaire dans bar. Vous devez tout stocker, pas une partie. Donc, sans modifier foo, vous pouvez créer une barre comme celle-ci.

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