在 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 中,我怎么能有两个不能相同的字段,只有一个是主键的主要内容,如果未能解决你的问题,请参考以下文章
用PHP+mysql查询两个表,然后怎么样把已经查出来的两个数组合并在一起,两张表里有一个相同的字段
sql中,group by除了和count()配合,还能有其他用法吗?