Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 唯一键和主键之间的区别_Mysql_Sql - Fatal编程技术网

Mysql 唯一键和主键之间的区别

Mysql 唯一键和主键之间的区别,mysql,sql,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; 我想知道为什么在同一个表中需要一个主键和唯一键?我想,这个问题的根本是,主键和唯一键之间有什

我在一本书中遇到了以下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;

我想知道为什么在同一个表中需要一个主键和唯一键?我想,这个问题的根本是,主键和唯一键之间有什么区别?

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

使用代理项键时,在代理项键以外的其他对象上具有另一个唯一约束对于避免重复数据至关重要


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

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

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

State      Abbr      Postal Code
--
Alabama    Ala.      AL
Alaska     Alaska    AK
Arizona    Ariz.     AZ
...
Wyoming    Wyo.      WY
CREATE TABLE states (
  state varchar(15) primary key,
  abbr varchar(10) not null unique,
  postal_code char(2) not null unique
);
很明显,这三列中的每个值都是唯一的——有三个候选键

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

State      Abbr      Postal Code
--
Alabama    Ala.      AL
Alaska     Alaska    AK
Arizona    Ariz.     AZ
...
Wyoming    Wyo.      WY
CREATE TABLE states (
  state varchar(15) primary key,
  abbr varchar(10) not null unique,
  postal_code char(2) not null unique
);
您可以这样做,因为SQL没有任何其他方式来表示“我的表有三个单独的候选键。”

我没有任何特别的理由选择“state”作为主键。我可以很容易地选择“缩写”或“邮政编码”。这三列中的任何一列也可以用作外键引用的目标

就这一点而言,我也可以把桌子做成这样

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

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


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

相似性

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

差异

PRIMARY
键(隐式)将所有键列定义为
notnull
;此外,一个表只能有一个主键



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

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

主键

主键不能有空值。 每个表只能有一个主键。 主键作为表上的索引实现。默认情况下,此索引是聚集索引。 主键可以作为外键与另一个表的相关。 我们可以借助自动递增字段自动生成ID。主键支持自动增值

唯一约束

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


您可以从以下位置找到详细信息:

事实上,大多数(如果不是所有的话)数据库产品都允许您根据唯一约束创建关系。因此,在理论上,您可以对这三个对象使用唯一的约束。从技术上讲,ISO可以使用“唯一键”而不是“唯一键”,但这是多余的。谢谢。这很有帮助。那么,当书中说
UNIQUE KEY
@cfarm54时,这意味着什么:它意味着名为“category”的列必须包含唯一的值。@cfarm54-“UNIQUE KEY”(除了冗余之外)是唯一的约束。也就是说,它是一个像主键约束一样的约束,强制类别列中的所有非空值都是唯一的。如果有人试图插入一个重复项,他们将得到一个错误,插入将被拒绝。为了完整起见,可能值得发布一些主键不同的实际原因,例如磁盘顺序。回答得不错。大多数产品都允许您在FK引用中使用唯一的约束。即,通常不要求您引用PK约束,即使这是最常见的约束。