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

Sql 列中的唯一值,但仅对每个关联的外键唯一,sql,sqlite,Sql,Sqlite,我为这个令人困惑的标题道歉,但我真的不知道如何用一句话来描述这个问题 我有一个SQLite数据库,用于一般性的小费竞争。对于那些不熟悉这一概念的人来说,人们会“给”他们认为会在每一轮体育比赛的每场比赛中获胜的人小费,而在比赛结束时给小费最正确的人获胜(奖金可能是金钱、荣誉等)。它在澳大利亚非常受AFL欢迎 基本结构是用户注册为所有者,然后他们可以创建任意数量的竞赛,每个竞赛都用外键链接到他们。这是数据库架构的相关部分: create table owner ( owner_id INTE

我为这个令人困惑的标题道歉,但我真的不知道如何用一句话来描述这个问题

我有一个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的支持非常有限,删除数据库并重新开始是一个非常好的选择。

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

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

这应该可以满足您的需要。

您可以使用以下语法创建复合唯一约束:

create table comp (
    comp_id INTEGER NOT NULL,
    comp_owner_id INTEGER NOT NULL,
    comp_name VARCHAR,
    CONSTRAINT comp_pk PRIMARY KEY (comp_id),
    CONSTRAINT comp_unique UNIQUE (comp_owner_id, comp_name),
    CONSTRAINT comp_owner_fk FOREIGN KEY (comp_owner_id) REFERENCES owner (owner_id) NOT DEFERRABLE
);
如果您关心的是将约束添加到已存在的表中,则可以使用以下方法:

 CREATE UNIQUE INDEX comp_unique (comp_owner_id, comp_name) ON comp

也可以考虑在所有者表中丢失OWER ErID列并简单地使用OWNER名称作为主键。同样,您可能不需要comp_id,因为该表中还有另一个候选项。

非常感谢,这正是我想要的。很抱歉花了这么长时间回复。