Come faccio a creare un FK a "bar" che fa riferimento alla PK in "pippo"?
Con la struttura attuale, non è possibile.
L'obiettivo di un riferimento di chiave esterna deve essere dichiarato PRIMARY KEY o UNIQUE. Quindi, o questo
CREATE TABLE foo (
id SERIAL PRIMARY KEY,
foo_created_on ABSTIME,
foo_deactivated_on ABSTIME,
UNIQUE (id, foo_created_on)
);
o questo
CREATE TABLE foo (
id SERIAL,
foo_created_on ABSTIME,
foo_deactivated_on ABSTIME,
PRIMARY KEY (id, foo_created_on),
UNIQUE (id)
);
avrebbe funzionato come obiettivo per bar.foo_id. Quindi la barra avrebbe un riferimento semplice.
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 si desidera fare riferimento alla chiave primaria dichiarata originariamente in foo, è necessario memorizzare quella chiave primaria nella barra. Devi conservarlo tutto, non parte di esso. Quindi, senza modificare foo, potresti costruire bar come questo.
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 (foo_id, foo_created_on),
PRIMARY KEY (id, bar_created_on)
);
Btw: il tipo di dati "ABSTIME" è disattivato. Dovresti utilizzare invece DATE o TIMESTAMP. –