【发布时间】:2009-08-20 20:22:33
【问题描述】:
有人在面试时问过我这个问题...
【问题讨论】:
-
您无法回答?真是个失败者!我也没有。
标签: sql primary-key
有人在面试时问过我这个问题...
【问题讨论】:
标签: sql primary-key
主键不能为空。唯一键可以。
【讨论】:
主键是表上的一个唯一字段,但它的特殊之处在于表将该行视为其键。这意味着其他表可以使用该字段与自己创建外键关系。
唯一约束只是意味着特定字段必须是唯一的。
【讨论】:
【讨论】:
TL;DR PRIMARY KEY 可以暗示很多东西(唯一性、可引用性、非空性、聚类等),但没有任何东西不能使用 UNIQUE 明确说明。
我建议,如果您是那种喜欢 SELECT * FROM... 的便利而又不必列出所有那些讨厌的列的编码人员,那么 PRIMARY KEY 就是您的最佳选择。
一个 relvar 可以有多个键,但我们只选择一个作为下划线 并将其称为主键。选择是任意的,所以 从逻辑的角度来看,初级的概念并不是很重要 观点。然而,密钥的一般概念非常重要!这 术语候选键的含义与键完全相同(即,加法 候选人没有实际意义——它是由 Ted Codd 提出的 因为他把每把钥匙都看作是被提名为 主键)... SQL 允许表列的子集 声明为该表的键。它还允许其中一个成为 指定为主键。指定一个键作为主键 为了与其他相关的一定程度的方便 可能需要的约束
通常...选择一个键作为主键(以及任何其他键) 然后将相关 relvar 的键称为备用键)。 但是是否要选择某个键作为主键,如果选择是哪个键, 本质上是心理问题,超出了 关系模型之类的。作为一种良好的做法,大多数基地 relvars 可能应该有一个主键——但是,重复一遍,这条规则, 如果这是一个规则,那么真的不是一个关系问题......强 推荐 [给 SQL 用户]:对于基表,无论如何,使用 主键和/或唯一规范,以确保每一个这样的 表确实至少有一个键。
SQL and Relational Theory: How to Write Accurate SQL Code 作者:C.J. 日期
在标准 SQL 中PRIMARY KEY
UNIQUE)。NOT NULL,但您可以在创建列时明确指定(但无论如何您都应该避免空值!)FOREIGN KEY 中省略其列,但您可以明确指定它们。在某些产品中,PRIMARY KEY 暗示表的聚集索引,但您可以明确指定(您可能不希望主键成为聚集索引!)
对于某些人PRIMARY KEY具有纯粹的心理意义:
【讨论】:
每个主键都是唯一约束,但除了 PK,表还可以有其他唯一约束。
假设您有一个员工表,PK EmployeeID。例如,您可以在 SSN 上添加唯一约束。
【讨论】:
唯一键约束:
它将允许列中的空值。
ALTER TABLE 表名 添加约束 UNIQUE_CONSTRAINT 唯一(column_name1,column_name2,...)
主键:
它不允许空值。
ALTER TABLE 表名 添加约束 KEY_CONSTRAINT 主键(列名)
【讨论】:
UNIQUE 约束可以是简单键或复合键(简单 = 一列,复合 = 多列),即在这方面与 PRIMARY KEY 没有区别。
除了 Andrew 的回答,每个表只能有一个主键,但可以有许多唯一约束。
【讨论】:
【讨论】:
主键是一组最小的列,这样在这些列中具有相同值的任何两条记录在所有列中都具有相同的值。请注意,一个主键可以由多个列组成。
唯一性约束正是它听起来的样子。
【讨论】:
UNIQUE 约束唯一标识数据库表中的每条记录。
UNIQUE 和 PRIMARY KEY 约束都为一列或一组列提供唯一性保证。
PRIMARY KEY 约束自动定义了一个 UNIQUE 约束。
请注意,每个表可以有许多 UNIQUE 约束,但每个表只能有一个 PRIMARY KEY 约束
【讨论】:
主键不能为空,但唯一约束可以为空。 当您为表选择主键时,它会自动索引该字段。
【讨论】:
主键本质上是 (unique +not null) 的组合。在引用外键时,rdbms 也需要主键。
唯一键只是强加列的唯一性。在唯一键的情况下,字段的值可以为 NULL。它也不能用于引用外键,这很明显,因为你可以在其中包含空值
【讨论】:
两者都保证表中各行的唯一性,但其他一些答案中提到的空值除外。
此外,主键“附带”一个索引,该索引可以是聚簇或非聚簇。
【讨论】:
到目前为止,这里有几个很好的答案。除了主键不能为空、本身是唯一约束、可以由多列组成之外,还有更深层次的含义取决于您使用的数据库服务器。
我是 SQL Server 用户,因此主键对我来说具有更具体的含义。在 SQL Server 中,默认情况下,主键也是所谓的“聚集索引”的一部分。聚集索引定义了该特定表的数据页的实际顺序,这意味着主键顺序与磁盘上行的物理顺序相匹配。
我知道 MySql 的一种(可能更多)表格式也支持聚集索引,这意味着它在 SQL Server 中所做的事情......它定义了磁盘上的物理行顺序。
Oracle 提供了一种称为索引组织表的东西,它按主键对磁盘上的行进行排序。
我对 DB2 不是很熟悉,但是我认为聚集索引意味着磁盘上的行与单独的索引以相同的顺序存储。我不知道聚集索引是否必须与主键匹配,或者它是否可以是一个不同的索引。
【讨论】:
这里的很多答案都讨论了 PK 与唯一约束的属性。但更重要的是理解概念上的差异。
主键被认为是数据库中记录的标识符。因此,例如在创建表之间的外键引用时会引用这些。因此,在正常情况下,主键不应包含在您的域中具有任何意义的值(通常自动递增字段用于此目的)。
唯一约束只是在您的数据库架构中执行特定领域业务规则的一种方式。
因为 PK 是记录的标识符,所以您永远不能更改主键的值。
【讨论】:
Becuase a PK it is an identifier for the record, you can never change the value of a primary key.您可能不应该更改主键,但您可以做到。