Jak mogę utworzyć FK w "bar", który odwołuje się do PK w "foo"?
Przy obecnej strukturze nie można.
Cel odniesienia dla obcego klucza musi być zadeklarowany jako PRIMARY KEY lub UNIQUE. Więc albo to
CREATE TABLE foo (
id SERIAL PRIMARY KEY,
foo_created_on ABSTIME,
foo_deactivated_on ABSTIME,
UNIQUE (id, foo_created_on)
);
czy to
CREATE TABLE foo (
id SERIAL,
foo_created_on ABSTIME,
foo_deactivated_on ABSTIME,
PRIMARY KEY (id, foo_created_on),
UNIQUE (id)
);
będzie działać jako cel dla bar.foo_id. Następnie pasek będzie miał proste odniesienie.
CREATE TABLE bar (
id SERIAL,
bar_created_on ABSTIME,
bar_deactivated_on ABSTIME,
foo_id REFERENCES foo (id),
PRIMARY KEY (id, bar_created_on)
);
Jeśli chcesz odwołać się do pierwotnego klucza pierwotnie zadeklarowanego w foo, musisz zapisać klucz podstawowy na pasku. Musisz to wszystko przechowywać, a nie jego część. Więc bez modyfikowania foo, możesz zbudować pasek w ten sposób.
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: typ danych "ABSTIME" jest de-obsługiwany. Zamiast tego należy użyć DATE lub TIMESTAMP. –