唯一键和主键之间的区别

loc*_*boy 12 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;
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*ll' 20

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

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

State      Abbr      Postal Code
--
Alabama    Ala.      AL
Alaska     Alaska    AK
Arizona    Ariz.     AZ
...
Wyoming    Wyo.      WY
Run Code Online (Sandbox Code Playgroud)

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

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

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

而且你会做类似的事情,因为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
);
Run Code Online (Sandbox Code Playgroud)


Luc*_*c M 8

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

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

  • 大多数产品都允许您在FK参考中使用Unique约束.即,通常不需要引用PK约束,即使这是最常见的. (3认同)