MySQL--在创建表时一起使用“主键”、“唯一键”和“键”的意思。

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (31)

有人能解释一下PRIMARY KEY,,,UNIQUE KEYKEY如果他们把它放在一起CREATE TABLE在MySQL中的声明?

CREATE TABLE IF NOT EXISTS `tmp` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uid` varchar(255) NOT NULL,
  `name` varchar(255) NOT NULL,
  `tag` int(1) NOT NULL DEFAULT '0',
  `description` varchar(255),
  PRIMARY KEY (`id`),
  UNIQUE KEY `uid` (`uid`),
  KEY `name` (`name`),
  KEY `tag` (`tag`)
) ENGINE=InnoDB AUTO_INCREMENT=1 ;

如何将此查询转换为MySQL?

提问于
用户回答回答于

键只是一个正常的索引。一种过于简单化的方法是把它想象成图书馆的卡片目录。它将MySQL指向正确的方向。

一个唯一的键也用于提高搜索速度,但是它有一个约束条件,即不存在重复项(在x不是y和x==y的情况下,不存在两个x和y)。

解释如下:

唯一索引创建一个约束,使得索引中的所有值都必须是不同的。如果尝试添加具有与现有行匹配的键值的新行,则会发生错误。此约束不适用于除BDB存储引擎之外的空值。对于其他引擎,唯一索引允许包含空的列的多个空值。如果在唯一索引中为列指定前缀值,则列值在前缀中必须是唯一的。

主键是“特殊”的唯一键。它基本上是一个独特的键,只是用来识别某个东西。

在MSSQL中,概念是相似的。有索引、唯一约束和主键。

未经测试,但我相信MSSQL的等效值是:

CREATE TABLE tmp (
  id int NOT NULL PRIMARY KEY IDENTITY,
  uid varchar(255) NOT NULL CONSTRAINT uid_unique UNIQUE,
  name varchar(255) NOT NULL,
  tag int NOT NULL DEFAULT 0,
  description varchar(255),
);

CREATE INDEX idx_name ON tmp (name);
CREATE INDEX idx_tag ON tmp (tag);

上面的代码经过测试是正确的;但是,我怀疑有一个更好的语法来做它。我已经有一段时间没有使用SQL Server了,显然我已经忘记了很多。

用户回答回答于

为了补充其他答案,文献资料给出这个解释:

  • KEY的同义词。INDEX...。关键属性PRIMARY KEY也可以指定为KEY在列定义中给出。这是为了与其他数据库系统兼容而实现的。
  • UNIQUE索引创建一个约束,使索引中的所有值必须是不同的。如果尝试添加具有与现有行匹配的键值的新行,则会发生错误。对于所有引擎,aUNIQUE索引允许多个NULL可以包含的列的NULL...
  • PRIMARY KEY是唯一的索引,必须将所有键列定义为NOT NULL...。如果它们未显式声明为NOT NULL,MySQL如此隐式地声明它们(并且是静默的)。一张桌子只能有一个PRIMARY KEY...。a的名称PRIMARY KEY总是PRIMARY,因此不能用作任何其他类型的索引的名称。

扫码关注云+社区