【发布时间】:2010-04-12 17:11:49
【问题描述】:
为什么数据库中需要 UNIQUE 约束?
你能提供任何例子吗?
默认情况下主键是唯一的...可以理解,因为它们在其他表中被称为外键...需要关系来连接它们以用于 rdbms 平台...
但为什么要将其他列称为 UNIQUE,这样做有什么好处?)
【问题讨论】:
-
根据定义,主键始终是唯一的。
标签: sql-server-2005 unique-constraint
为什么数据库中需要 UNIQUE 约束?
你能提供任何例子吗?
默认情况下主键是唯一的...可以理解,因为它们在其他表中被称为外键...需要关系来连接它们以用于 rdbms 平台...
但为什么要将其他列称为 UNIQUE,这样做有什么好处?)
【问题讨论】:
标签: sql-server-2005 unique-constraint
应尽可能使用约束以确保数据库符合预期。在这种特殊情况下,唯一约束对于确保数据质量最有用。
例如,唯一约束可能对电子邮件地址列有用,这将要求没有两行具有相同的电子邮件地址 - 虽然它不会是 PK,并且通常会被允许更改。
只要您期望唯一性,并且该值尚未受到 PK 或类似的约束,那么添加唯一性约束可以确保始终保留您的假设。
一般情况下,约束也可以be used by the optimizer。
Celko 关于约束系列的第二篇文章专门针对unique constraints。
【讨论】:
当某些东西是主键时,我不希望它改变 - 它应该是静态的,因为它用于链接到数据库中的其他表。如果您的“主键”将发生变化(例如,用户名),那么它应该是表中的一个附加字段,而主键应该是某种递增的 ID。
但是,您仍然不能让两个用户使用相同的用户名 - 在这种情况下,唯一的约束是必要的。
【讨论】:
用户名是唯一的,但不是 PK。 UserId 是 PK。
【讨论】:
PK 和 UQ 之间存在一些差异。 PK 不能有 NULL 值,而 UQ 可以有 1 个空值(Oracle 允许多个 NULL 值)。 每张桌子只能有 1 个 PK,但每张桌子可以有多个 UQ 默认情况下,PK 是集群的(但不是必须的)
【讨论】:
大多数时候,在我们设计数据库时,我们将主键保留为身份字段。尽管将其作为身份字段是有意义的,但它可能无法解决实现唯一性的问题。为了确保行是唯一的,我们在列上设置了唯一约束(因为 Andrey 指定了 UserNane)。这是MSDN 说的:
您可以使用 UNIQUE 约束来确保在不参与主键的特定列中不会输入重复值。尽管 UNIQUE 约束和 PRIMARY KEY 约束都强制执行唯一性,但当您想要强制非主键的列或列组合的唯一性时,请使用 UNIQUE 约束而不是 PRIMARY KEY 约束。
HTH
【讨论】:
如果要求数据是唯一的,那么你需要一个唯一的约束。否则你会得到糟糕的数据。 PK 必须是唯一的,但这并不意味着其他数据也不需要是唯一的。也许每条记录都必须有唯一的日期时间,这不太可能是 PK,但必须以某种方式强制执行唯一性。
特别是如果您为 PK 使用代理键(我强烈推荐),那么您希望确保自然键字段是唯一约束的一部分,以避免数据重复。
查找类型数据也是如此。假设您有一个医生专业列表,您的用户可以在输入数据时从中进行选择,并假设他们也可以在需要时添加到此列表中。一个独特的约束将防止多次输入 Oncologist,这将使您更容易找到实际上是 Oncologists 的人数。
【讨论】:
emailID 可以是唯一的。
uniqueID 和 主键 之间的区别是唯一的,它支持整个列中的单个 null,但 PK 不会。
【讨论】: