admin

列中的唯一值,但仅对于每个关联的外键是唯一的

sql

我为令人困惑的标题表示歉意,但我真的不确定如何用一句话来描述这个问题。

我有一个用于一般小费竞赛的SQLite数据库。对于那些不熟悉该概念的人,他们认为会在体育比赛的每一轮的每场比赛中获胜的人都将获得“小费”,而在比赛结束时获得最正确小费的人将获胜(奖品可能是金钱,骄傲)
, 等等)。AFL在澳大利亚非常受欢迎。

基本结构是用户注册为所有者,然后他们可以根据需要创建任意数量的竞赛,并且每个竞赛都使用外键链接到他们。这是数据库模式的相关部分:

create table owner (
    owner_id INTEGER NOT NULL,
    owner_name VARCHAR NOT NULL,
    owner_nick VARCHAR UNIQUE NOT NULL,
    owner_email VARCHAR NOT NULL,
    owner_password VARCHAR NOT NULL,
    CONSTRAINT owner_pk PRIMARY KEY (owner_id)
);

create table comp (
    comp_id INTEGER NOT NULL,
    comp_owner_id INTEGER NOT NULL,
    comp_name VARCHAR UNIQUE NOT NULL,
    CONSTRAINT comp_pk PRIMARY KEY (comp_id),
    CONSTRAINT comp_owner_fk FOREIGN KEY (comp_owner_id) REFERENCES owner (owner_id) NOT DEFERRABLE
);

问题的要点是:我想在comp表的comp_name字段上强制使用唯一约束(如上所示),因为单个所有者不应有两个或多个同名比赛。但是,两个不同的所有者完全有可能想要两个同名的不同比赛(例如,两个办公室为同一个体育联赛开办小费竞赛)。可以使用SQL强制执行此操作,还是我需要在其他地方手动执行该操作?

一些注意事项:

  • 我正在使用SQLite 3.6.20,它具有适当的外键约束实施
  • 该数据库永远不会在生产级应用程序中使用。这是一个私人项目。
  • 该数据库正在基于Web的PHP应用程序中使用。
  • 如果这不能用SQLite实现,那么可以用MySQL做到吗?

编辑:我觉得我应该指出,我知道SQLite对alter table的支持非常有限,删除数据库并重新开始是一个很大的选择。


阅读 229

收藏
2021-07-01

共1个答案

admin

只需UNIQUE在这两个字段上创建一个约束,如下所示:

create table comp (
    comp_id INTEGER NOT NULL,
    comp_owner_id INTEGER NOT NULL,
    comp_name VARCHAR NOT NULL,
    CONSTRAINT comp_unq UNIQUE (comp_owner_id, comp_name),
    CONSTRAINT comp_pk PRIMARY KEY (comp_id),
    CONSTRAINT comp_owner_fk FOREIGN KEY (comp_owner_id) REFERENCES owner (owner_id) NOT DEFERRABLE
);

那应该做你想要的。

2021-07-01