Microsoft SQL Server 2008 主键的含义

Posted

技术标签:

【中文标题】Microsoft SQL Server 2008 主键的含义【英文标题】:Meaning of Primary Key to Microsoft SQL Server 2008 【发布时间】:2010-02-14 22:02:14 【问题描述】:

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

替代方案:

    alter table 添加主键集群 alter table 创建聚集索引

有影响吗?

【问题讨论】:

【参考方案1】:

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

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

(a) 由于主键通常会在 JOIN 中使用,因此主键上的索引(其大小、分布...)比其他索引与性能的相关性要高得多。

(b) 由于主键在其他表中用作外键,更改主键值总是很麻烦,因为其他表中的所有外键值都需要也修改了。

【讨论】:

事实上,我在这里所说的也适用于通过 FOREIGN KEY 引用的非空唯一键。我不确定 SQL Server 是否在 UNIQUE 和 PRIMARY 之间有所不同,这就是我刚刚开始这个问题的原因:***.com/questions/2263119 UNIQUE 和 PRIMARY KEY 之间有区别——你自己已经提到过了。在 PRIMARY KEY 中,列不能为 NULL。在 UNIQUE CONSTRAINT 中,它们可能为 NULL(在这种情况下,它不是标识符) @Roland:你是对的,当然。我的意思是:“我不确定 SQL Server 是否会在 NON-NULL UNIQUE 和 PRIMARY 之间产生差异,...”【参考方案2】:

主键是一个约束 - 这是一个逻辑对象,它说明了您的数据必须遵守的规则。索引是一种访问结构——它说明了机器搜索数据的方式。为了实现 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”,但是更改其中一个的名称会立即更改其他文件夹中相应对象的名称。所以我认为这里的区别在这种情况下并不真正存在。

【讨论】:

以上是关于Microsoft SQL Server 2008 主键的含义的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft SQL Server 2008 R2 安装遇到的问题

Microsoft SQL Server 2008 R2 安装遇到的问题

Microsoft SQL Server 2008 日志分析

还原数据库时出现 Microsoft SQL Server 2008 错误

Microsoft SQL Server 2008 主键的含义

Microsoft SQL Server 2008:写入服务器失败