postgresql 创建唯一组合键,其中一个组件是外键

l7wslrjt  于 2022-12-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(153)

我正在使用Postgres,并尝试为记分牌应用程序建模(比如,一个人记录棋盘游戏的分数)。
例如,Alice是应用程序上的一名用户,她想为自己和她的朋友Bob、卡登和大卫记分。她的朋友都不是用户,但他们不需要创建帐户,Alice就可以将他们添加到记分板中。
后来,卡登对这个应用程序印象深刻,决定创建一个帐户。Alice可以将她添加到记分板上的Caden链接到应用程序上的实际帐户。
因此,我将用户定义为拥有账户的人,将玩家定义为“临时”账户,稍后可以链接到用户。用户可以通过将玩家添加到记分牌来管理玩家。以下是我的初始模式:

用户

| 用户标识|用户名|电子邮件|
| - ------|- ------|- ------|
| u1|爱丽丝|alice@email.com|
| u2|卡登|caden@email.com|

玩家

| 播放器ID|姓名|
| - ------|- ------|
| 第1页|爱丽丝|
| 第二页|鲍勃|
| 第三代|卡登|
| 第四页|大卫|

名玩家将由谁主持

| 播放器ID| moderated_by(用户的外键)|
| - ------|- ------|
| 第1页|u1|
| 第二页|u1|
| 第三代|u1|
| 第四页|u1|

玩家链接到

| 播放器ID| linked_to(用户的外键)|
| - ------|- ------|
| 第1页|u1|
| 第三代|u2|
现在,我想创建两个独特的约束

  • moderated_byplayers.name,使得用户不能混淆地在记分牌上添加具有相同的确切名字的两个运动员
  • moderated_bylinked_to,使得用户不能添加碰巧链接到同一用户的两个播放器

然而,在这两种情况下,这两个组件都是独立表中的键/列。我如何在SQL中定义这些常量?

fnvucqvd

fnvucqvd1#

您的表似乎太多。请在一个表中收集有关某个玩家的所有数据。例如:

create table players(
    id int generated always as identity primary key,
    player_name text,
    moderated_by int references users,
    linked_to int references users
);

由于linked_to可能是null,因此需要一个部分唯一索引(不能显式定义为表约束):

create unique index on players(player_name, moderated_by);
create unique index on players(moderated_by, linked_to) where linked_to is not null;

相关问题