sql >> Database >  >> RDS >> PostgreSQL

Postgres FK verwijst naar composiet PK

Met je huidige structuur kan dat niet.

Het doel van een refererende sleutelreferentie moet ofwel PRIMARY KEY of UNIQUE worden verklaard. Dus ofwel dit

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

of dit

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

zou werken als een doelwit voor bar.foo_id. Dan zou de balk een eenvoudige verwijzing hebben.

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

Als u wilt verwijzen naar de primaire sleutel die u oorspronkelijk in foo hebt gedeclareerd, moet u die primaire sleutel in bar opslaan. Je moet het allemaal opslaan, niet een deel ervan. Dus zonder foo aan te passen, zou je een bar op deze manier kunnen bouwen.

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


  1. MySQL, update meerdere tabellen met één query

  2. SQL:Sorteer op prioriteit, maar zet 0 als laatste

  3. SQL Server-back-upcontrole

  4. Postgresql installeren met Homebrew en Rails op Mountain Lion