2010-03-16 81 views

回答

8

不同之处在于: 主键默认会创建聚簇索引,并且一个表中只能存在一个PK。主键可以覆盖多个列(复合键)

+5

您可以拥有跨越多个列的唯一约束。 – Thilo 2010-03-16 06:05:27

4

没有两个不相同,但是相似,当列是唯一的时,它具有唯一值,但它也允许该列中有一个Null值,但是Primary不允许任何空值。主键可用于其他表中的参考。

在声明UNIQUE约束只能有一个表中的但多个唯一键

主键,SQL Server创建唯一索引加快寻找重复的过程。在这种情况下,索引默认为NONCLUSTERED索引,因为每个表只能有一个CLUSTERED索引。

  • 每个表的唯一约束数受限于表上的索引数,即249 NONCLUSTERED索引和一个可能的CLUSTERED索引。

与PRIMARY键相反,UNIQUE约束可以接受NULL而只是一次。如果约束是在字段组合中定义的,那么每个字段都可以接受NULL,并且可以有一些值,只要组合值是唯一的。

快乐编码!

+0

“UNIQUE约束可以接受NULL但只是一次”:与AvatarKava所说的相矛盾:UNIQUE键可能为NULL,并且允许多个NULL值。哪一个? – Thilo 2010-03-16 06:23:52

+2

From:http://dev.mysql.com/doc/refman/5.0/en/create-index.html UNIQUE索引创建一个约束条件,以便索引中的所有值都必须是不同的。如果尝试使用与现有行匹配的键值添加新行,则会发生错误。此约束不适用于除BDB存储引擎以外的NULL值。对于其他引擎,UNIQUE索引允许可以包含NULL的列的多个NULL值。如果您为UNIQUE索引中的列指定前缀值,则列值在前缀中必须是唯一的。 – AvatarKava 2010-03-16 06:30:40

+1

这个问题被标记为“mysql”,但我相信Oracle还允许多个NULL值(两个NULL永远不会相等)。这似乎是更自然的惯例。 – Thilo 2010-03-16 06:35:03

0

没有。将列设置为唯一与将其设置为主键或主键的一部分非常不同。

13

没有。

PRIMARY KEY必须是唯一的,但UNIQUE键不一定是主键。你可以在一个表中有多个UNIQUE键。

关键的区别是PRIMARY键不能有NULL值,因为它们必须唯一标识一行。 UNIQUE键可能是NULL,并且允许多个NULL值(除非您使用像BDB这样的非常见表引擎)。

+1

呃这是一个无意的可怕的双关语。 – AvatarKava 2010-03-16 06:08:56

+0

我似乎记得试图在表上创建一个唯一的索引,并且因为多个NULL值而无法访问,但我必须绊倒。 – Duncan 2010-03-16 06:25:11

+0

可能已经回到了4.x,邓肯 - 我相信他们确实有那个约束:http://dev.mysql.com/doc/refman/5.0/en/create-index.html – AvatarKava 2010-03-16 06:31:26

4

UNIQUE仍然可以为NULL。

PRIMARY KEY表示UNIQUE和NOT NULL,每个表只能有一个PRIMARY KEY。

相关问题