我注意到如果引用的键不唯一,则无法创建外键,但是,如果我有(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)
);
答案 0 :(得分:1)
大多数数据库都要求外键约束为主键或唯一键(其中任何一个都可以是复合键)。
我不知道扩展功能允许主键或唯一键的列超集。也许有些数据库确实允许它。另一方面,当较小的集合工作时,我不能轻易想到使用额外的辅助密钥。
(警告:我实际上可以想到一种情况,但Postgres有表继承使得使用不必要。)