3

主键的概念对SQL Server的数据库引擎有什么意义?我不是指在“ID”列上创建的聚簇/非聚簇索引,我的意思是约束对象“主键”。它存在与否有关系吗?主键对Microsoft SQL Server 2008的含义

替代方案:

  1. ALTER TABLE添加主键聚集
  2. ALTER TABLE创建聚集索引

是否有所作为?

回答

6

通常,KEY是一个列(或列的组合),用于唯一标识表中的每一行。表中可能有多个KEY(例如,您可能有一个Person表,其中社会安全号码和自动递增号码都是密钥)。

数据库设计人员选择这些KEY中的一个是PRIMARY KEY。从概念上讲,哪个 KEY被选为PRIMARY KEY并不重要。但是,由于PRIMARY KEY通常用于从其他表中引用此表中的条目(通过FOREIGN KEY),因此选择一个好的PRIMARY KEY可能与w.r.t相关。 (一)性能和(b)可维护性

(a)由于主键通常将被用于连接,在主键的索引(其大小,其分布,...)是性能要比其他指标更重要。 (b)由于主键被用作其他表中的外键,所以更改,主键值总是很麻烦,因为其他表中的所有外键值也需要修改。

+0

事实上,我在这里说的也适用于通过FOREIGN KEY引用的非空UNIQUE键。我不确定SQL Server是否会在UNIQUE和PRIMARY之间产生差异,为什么我刚刚开始了这个问题:http://stackoverflow.com/questions/2263119 – Heinzi 2010-02-14 22:42:27

+2

UNIQUE和PRIMARY KEY之间存在区别 - 你提到过你自己已经。在PRIMARY KEY中,列不能为NULL。在一个唯一约束中,它们可能是NULL(在这种情况下,它不是一个标识符) – 2010-02-14 22:55:42

+0

@Roland:当然你是对的。我的意思是:“我不确定SQL Server是否能够区分* NON-NULL * UNIQUE和PRIMARY,...” – Heinzi 2010-02-14 23:06:08

4

PRIMARY KEY是一个约束 - 这是一个逻辑对象,它说明了您的数据必须遵守的规则。索引是一种访问结构 - 它说明了机器可以通过数据搜索的方式。要实现PRIMARY KEY,大多数RDBMS-es使用索引。

有些RDBMS-es(例如MySQL)不区分PRIMARY KEY或UNIQUE约束和用于帮助实现它的索引。但是,例如,Oracle会:在oracle中,您可以执行如下操作:ALTER TABLE t DROP pk KEEP INDEX。如果您想要更改主键的定义(例如,您使用代理主键替换自然主键),但是您仍希望对原始主键列具有唯一约束而不重建索引,这非常有用。如果索引非常大并且需要大量表格和资源进行重建,那么这很有意义。

从我所看到的,MS SQL没有作出区分。我的意思是像Management Studio这样的工具在不同的文件夹中显示“Keys”,“Indexes”和“Constraints”,但改变其名称会立即改变其他文件夹中相应对象的名称。所以我认为这里的区别并不存在。