在 SQL 中,我怎么能有两个不能相同的字段,只有一个是主键

Posted

技术标签:

【中文标题】在 SQL 中,我怎么能有两个不能相同的字段,只有一个是主键【英文标题】:In SQL how can I have two fields that can't both be identical, only one is a primary key 【发布时间】:2009-01-31 10:46:36 【问题描述】:

我正在使用 mysql,我有三个表,一个任务表,一个产品表和一个描述两者之间关系的表:每个产品由多个任务组成,每个任务可能在多个任务中找到产品。

描述两者关系的表有两个主键 ProductID 和 TaskID,它们也是外键。在这个表中,我有一个名为 TaskOrder 的字段,它为给定的产品列出了必须执行任务的顺序。

我想说的是,对于任何产品,您都不能有两个具有相同 TaskOrder 的任务,但是我不能只将 TaskOrder 设置为唯一,因为不同的产品将(并且应该)具有重复的 TaskOrder 值

有没有办法做到这一点?

【问题讨论】:

【参考方案1】:

你想要一个唯一的约束:

create table ProductTasks
 ( ProductID ...
 , TaskId ...
 , TaskOrder ...
 , primary key (ProductId, TaskId)
 , unique (ProductId, TaskOrder)
 );

【讨论】:

非常感谢,我想我可能会采用你的格式,请问哪里有布局指南?我想知道它会如何处理,比如说,并插入具有多个条目的语句。 SQL 布局取决于个人喜好和/或当地标准。我喜欢带前缀的逗号,因为它们有点像“要点”,而且很容易看出没有任何遗漏或多余。有些人讨厌这种风格,说(合理地)逗号属于某事之后,而不是之前!【参考方案2】:

通过将以下内容添加到表创建命令中,在 ProductID TaskOrder 这两个字段的组合上创建唯一索引:

CONSTRAINT UNIQUE (ProductID, TaskOrder)

【讨论】:

【参考方案3】:

联结表有一个主键,但它是具有两个字段的多字段键(其他表的两个 FK)。 PK 不必只有一个字段。

【讨论】:

以上是关于在 SQL 中,我怎么能有两个不能相同的字段,只有一个是主键的主要内容,如果未能解决你的问题,请参考以下文章