sql >> Base de Datos >  >> RDS >> PostgreSQL

PK compuesto de referencia de Postgres FK

Con tu estructura actual, no puedes.

El objetivo de una referencia de clave externa debe declararse CLAVE PRINCIPAL o ÚNICA. Así que esto

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

o esto

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

funcionaría como un objetivo para bar.foo_id. Entonces bar tendría una referencia 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 desea hacer referencia a la clave principal que declaró originalmente en foo, debe almacenar esa clave principal en la barra. Tienes que almacenarlo todo, no parte de él. Así que sin modificar foo, podrías construir una barra como esta.

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