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 错误