唯一键和主键之间的区别

时间:2011-06-16 23:54:20

标签: mysql sql

我在书中遇到了以下SQL:

CREATE TABLE 'categories'(
id SMALLINT NOT NULL AUTO INCREMENT,
category VARCHAR(30) NOT NULL,
PRIMARY KEY('id'),
UNIQUE KEY 'category'('category')
)ENGINE=MyISAM DEFAULT CHARSET = utf8;

我想知道为什么我需要在同一张表中使用PRIMARY和UNIQUE KEY?我想,问题的基础是,PRIMARY和UNIQUE键有什么区别?

5 个答案:

答案 0 :(得分:20)

关系模型表明,一个键与另一个键之间没有本质区别。也就是说,当关系具有多个候选键时,没有理论上的理由来声明键比那个键更重要。从本质上讲,这意味着没有理论上的理由将一个密钥标识为主密钥,而将所有其他密钥标识为辅助密钥。 (但可能有实际的原因。)

许多关系都有多个候选键。例如,美国各州的关系可能包含这样的数据。

State      Abbr      Postal Code
--
Alabama    Ala.      AL
Alaska     Alaska    AK
Arizona    Ariz.     AZ
...
Wyoming    Wyo.      WY

很明显,这三列中的每一列中的值都是唯一的 - 有三个候选键。

如果您要在SQL中构建一个表来存储这些值,您可以这样做。

CREATE TABLE states (
  state varchar(15) primary key,
  abbr varchar(10) not null unique,
  postal_code char(2) not null unique
);

你会做那样的事情,因为SQL没有任何其他方式可以说“我的表有三个独立的候选键。”

我没有任何特别的理由选择“州”作为主键。我可以轻松选择“abbr”或“postal_code”。这三列中的任何一列都可以用作外键引用的目标。

就这一点而言,我本可以建立这样的表格。

CREATE TABLE states (
  state varchar(15) not null unique,
  abbr varchar(10) not null unique,
  postal_code char(2) not null unique
);

答案 1 :(得分:7)

我很惊讶没有人提到主键可以作为外键引用到其他表中。

此外,唯一约束允许NULL值。

答案 2 :(得分:4)

您需要两个唯一性限制(一个是主键)的原因是您使用Id作为代理键。即,它是一个与数据本身无关的任意值。如果没有唯一密钥(或通俗地称为“业务密钥”,即用户将识别为强制执行的密钥),则用户可以添加具有不同任意Id值的两个相同category值。由于用户永远不会看到代理密钥,他们不会知道为什么他们会看到重复,即使数据库认为它们是不同的。

使用代理键时,对代理键以外的其他内容设置另一个唯一约束对于避免重复数据至关重要。

取决于您与谁交谈以及他们如何阅读规范,唯一密钥(顺便说一句是冗余的。“密钥”根据定义是唯一的)也不应该允许空值。但是,人们也可以阅读规范,因为与主键约束不同,唯一约束实际上应该允许空值(允许多少空值也因供应商而异)。大多数产品(包括MySQL)都允许在Unique约束中使用空值,而主键约束则不允许。

答案 3 :(得分:3)

<强>相似度

PRIMARYUNIQUE索引都会创建一个约束,要求所有值都是不同的(1)。

<强>差分

PRIMARY键(隐式)将所有键列定义为NOT NULL;另外,一个表只能有一个主键。


(1)每个NULL值被认为是不同的。

答案 4 :(得分:1)

UNIQUE约束和PRIMARY键都相似,它提供了定义它们的列的唯一强制唯一性。 主键和唯一键之间的一些基本区别如下。

主键

主键不能具有NULL值。 每个表只能有一个主键。 主键在表上实现为索引。默认情况下,此索引是聚簇索引。 主键可以与另一个表作为外键相关联。 我们可以在Auto Increment字段的帮助下自动生成ID。主键支持自动增量值。

唯一约束

唯一约束可能具有NULL值。 每个表都可以有多个唯一约束。 Unique Constraint也作为表的索引实现。默认情况下,此索引是非聚集索引。 唯一约束不能与另一个表作为外键相关联。 唯一约束不支持自动增量值。

您可以从以下网址找到详细信息:http://www.oracleinformation.com/2014/04/difference-between-primary-key-and-unique-key.html