Postgresql Postgres FK引用复合PK

Postgresql Postgres FK引用复合PK,postgresql,Postgresql,考虑 CREATE TABLE foo ( id SERIAL, foo_created_on ABSTIME, foo_deactivated_on ABSTIME, PRIMARY KEY (id, foo_created_on) ); CREATE TABLE bar ( id SERIAL, bar_created_on ABSTIME, bar_deactivated_on ABSTIME, foo_id REFEREN

考虑

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

CREATE TABLE bar (
    id SERIAL,
    bar_created_on ABSTIME,
    bar_deactivated_on ABSTIME,
    foo_id REFERENCES ( .. what goes here? ..),
    PRIMARY KEY (id, bar_created_on)
);

如何在“bar”中创建引用“foo”中PK的FK?

您必须创建单独的外键:

CREATE TABLE bar (
  id SERIAL,
  bar_created_on ABSTIME,
  bar_deactivated_on ABSTIME,
  foo_id INT,
  FOREIGN KEY (foo_id, created_on) REFERENCES foo (id, created_on),
  PRIMARY KEY (id, bar_created_on)
);
如何在“bar”中创建引用“foo”中PK的FK

以你目前的结构,你不能

外键引用的目标必须声明为主键或唯一。所以要么这个

CREATE TABLE foo (
    id SERIAL PRIMARY KEY,
    foo_created_on ABSTIME,
    foo_deactivated_on ABSTIME,
    UNIQUE (id, foo_created_on)
);
还是这个

CREATE TABLE foo (
    id SERIAL,
    foo_created_on ABSTIME,
    foo_deactivated_on ABSTIME,
    PRIMARY KEY (id, foo_created_on),
    UNIQUE (id)
);
将作为bar.foo_id的目标。然后bar将有一个简单的引用

CREATE TABLE bar (
    id SERIAL,
    bar_created_on ABSTIME,
    bar_deactivated_on ABSTIME,
    foo_id REFERENCES foo (id),
    PRIMARY KEY (id, bar_created_on)
);
如果要引用最初在foo中声明的主键,必须将该主键存储在bar中。您必须存储所有信息,而不是其中的一部分。所以不需要修改foo,就可以像这样构建bar

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

对不起,不清楚。。。(我应该给“created_on”一栏起一个独特的名字来消除歧义……现在看更新的问题)。上面的咒语是“条形”模式吗?请记住,bar是在为bar条目而不是foo条目创建的轨道上创建的。我更新了答案。我不知道你的foo_id是用来做什么的,所以我只是把它设为int。引用很简单,但可能我不明白你的意思。顺便说一句,“Abtime”数据类型不受支持。您应该使用日期或时间戳。