PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Postgres FK referenciando PK composto


Com sua estrutura atual, você não pode.

O destino de uma referência de chave estrangeira deve ser declarado PRIMARY KEY ou UNIQUE. Então ou isso
CREATE TABLE foo (
    id SERIAL PRIMARY KEY,
    foo_created_on ABSTIME,
    foo_deactivated_on ABSTIME,
    UNIQUE (id, foo_created_on)
);

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

funcionaria como um destino para bar.foo_id. Então bar teria uma referência simples.
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 você quiser fazer referência à chave primária que você declarou originalmente em foo, você deve armazenar essa chave primária em bar. Você tem que armazenar tudo, não parte dele. Então, sem modificar foo, você pode construir uma barra assim.
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)
);