主键和唯一键约束之间有什么区别?

pva*_*896 20 sql-server database-design sql-server-2005 primary-key

Primary keyAnd 之间有什么区别unique Key constraint

有什么用?

Mar*_*ith 12

两者都用于表示表的候选键.

您只能为表创建一个主键,因此如果您有多个候选项,则只需选择一个主键.

可以在外键约束中使用.在SQL Server中,主键列不能为空.Unique Key约束中使用的列可以是.

默认情况下,在SQL Server中,如果主键在堆上创建,则主键将成为聚簇索引,但PK和聚簇索引应该是相同的,这绝不是强制性的.

  • @ vgv8 - 堆是没有聚簇索引的表.如果在堆上运行`ALTER TABLE dbo.tbl ADD CONSTRAINT PKNAME PRIMARY KEY(foo)`,它将创建一个聚簇索引,其索引的键是PK列.如果表已有聚簇索引,则它将创建非聚簇唯一索引. (2认同)

Jon*_*nna 7

主键是用于标识所讨论的行的键.它可能还有一些意义(如果已经有一些"真实"数据可以服务),或者它可能纯粹是一个实现工件(大多数IDENTITY列,以及其他数据库系统上的等效自动递增值).

唯一键是更一般的情况,其中键不能具有重复值.在大多数情况下,人们不能拥有与同一管辖区相同的社会安全号码(国际案例可能不同).因此,如果我们存储社会安全号码,那么我们希望将它们建模为唯一的,因为它们匹配现有数字的任何情况都显然是错误的.用户名通常也必须是唯一的,所以这是另一种情况.外部标识符(由另一个系统,标准或协议使用的标识符)往往也是唯一的,例如,只有一种语言具有给定的ISO 639代码,因此如果我们存储ISO 639代码,我们将其建模为唯一.

这种独特性也可以跨越多个列.例如,在大多数分层分类系统(例如文件夹结构)中,没有项目可以具有相同的父项和相同的名称,尽管可能存在具有相同父项和不同名称的其他项,以及具有相同名称和不同名称的其他项父母.这种多列功能也存在于主键上.

表还可以具有多个唯一键.例如,用户可以同时具有id号和用户名,并且两者都需要是唯一的.

因此,任何不可空的唯一键都可以用作主键.有时,来自建模的固有数据的主键被称为"自然主键",因为它们是数据的"自然"部分,而不仅仅是实现假象.决定使用哪个取决于以下几点:

  1. 规格变更的可能性.如果我们将社会安全号码建模为唯一,然后必须适应允许多个司法管辖区,其中两个或更多使用类似的足够编号系统以允许冲突,我们可能只需要删除唯一性约束(可能需要其他更改).如果它是我们的主键,我们现在还需要使用新的主键,并将任何使用该主键的表更改为关系的一部分,以及任何加入它的查询.

  2. 查询速度.关键效率可能很重要,因为它们在许多WHERE条款中使用,并且(在更多情况下)在许多条款中使用JOIN.随着JOINS特别,查找的速度是至关重要的.影响将取决于实现细节,不同的数据库根据它们处理不同数据类型的方式而有所不同(从性能角度来看,在Postgres中使用大块文本作为主键,我可以指定使用hash join,但是我会在SQLServer中非常犹豫[编辑:对于"大"我想的可能是用户名的大小,而不是整个挪威语Eddas的大小!]).

  3. 密钥的频率是唯一有趣的数据.例如,使用语言表和该语言的注释表,通常我在处理注释表时想要加入语言表的唯一原因是获取语言代码或限制对具有特定语言代码的人的查询.关于该语言的其他信息可能更少使用.在这种情况下,加入代码的效率可能低于加入来自的数字ID集IDENTITY列,将代码作为主键 - 因此存储在注释表的外键列中 - 将根本不需要任何JOIN,从而获得相当大的效率增益.虽然我想从相关表格中获取更多信息,但更常见的是,使JOIN更高效更为重要.


小智 5

首要的关键:

  1. 主键只是它唯一标识表中的每一行.

  2. 主键不允许重复值,也不允许NULL.

  3. 默认情况下,主键是聚簇索引.

  4. 一个表只能有一个主键.

独特的关键:

  1. 唯一键只是它唯一标识表中的每一行.

  2. 唯一键不允许重复值,但允许(最多一个)NULL.

  3. 默认情况下,唯一键是非聚集索引.

这是一个了解主键 数据库键的完整水果链接. 请记住,表中只有一个聚簇索引[谈论SQL Server 2005].现在,如果我们要添加另一个唯一列,那么我们将使用Unique Key列,因为可以添加多个Unique Key列.

  • "什么都不是"是什么意思? (5认同)