PostgreSQL - 为什么我不能基于唯一列创建复合外键而不将复合键声明为唯一?

时间:2017-03-03 20:56:27

标签: sql postgresql foreign-keys unique-constraint composite-key

我注意到如果引用的键不唯一,则无法创建外键,但是,如果我有(x, y, z) x唯一的记录,则“直观”假设每条记录都将是独一无二的。

那么,是否有任何特殊原因我没有考虑为什么我不能做这样的事情

create table x(
    id int primary key,
    something int not null
);
create table y(
    id serial primary key, -- whatever, this doesn't matter
    x_id int not null,
    x_something int not null,
    foreign key (x_id, x_something)
        references x(id, something)
);

在Postgres抛出

ERROR:  there is no unique constraint matching given keys for referenced table "x"

可以在表unique (id, something)中添加x进行更正。

这种行为是出现在Postgres中,还是在SQL标准中定义的?

有没有办法在不需要unique约束的情况下引用复合键?

编辑1: 以下是一个有用的情况示例

create table movie_reservation(
    id serial primary key,
    movie_id int references(...),
    -- ... (reservation data like the time and interval),
    seen boolean not null default false -- wether a user has seen it
);
-- want califications of moves that HAVE BEEN SEEN
create table movie_calification(
    movie_reservation_id int not null,
    seen boolean
      not null
      check (boolean = true),
    stars smallint
        not null
        check (stars between 1 and 5),


    foreign key (movie_reservation_id, seen)
        references movie_reservation(id, seen)
);

1 个答案:

答案 0 :(得分:1)

大多数数据库都要求外键约束为主键或唯一键(其中任何一个都可以是复合键)。

我不知道扩展功能允许主键或唯一键的列超集。也许有些数据库确实允许它。另一方面,当较小的集合工作时,我不能轻易想到使用额外的辅助密钥。

(警告:我实际上可以想到一种情况,但Postgres有表继承使得使用不必要。)