MySQL - 创建表时一起使用时"PRIMARY KEY","UNIQUE KEY"和"KEY"的含义

sur*_*a2k 63 mysql sql-server primary-key unique-key

任何人都可以解释一下目的PRIMARY KEY,UNIQUE KEY并且KEY,如果将它放在CREATE TABLEMySQL 中的单个语句中?

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 ;
Run Code Online (Sandbox Code Playgroud)

如何将此查询转换为MSSQL?

Cor*_*bin 90

密钥只是一个普通的索引.简化的一种方法是将其视为图书馆的卡片目录.它指向正确的方向MySQL.

唯一键也用于提高搜索速度,但它有一个约束,即不能有重复项(没有两个x和y,其中x不是y,x == y).

手册如下解释它:

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

主键是"特殊"唯一键.它基本上是一个唯一的密钥,除了它用于识别某些东西.

该手册解释了索引的使用方式:这里.

在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);
Run Code Online (Sandbox Code Playgroud)

编辑:上面的代码测试是正确的; 但是,我怀疑这样做有更好的语法.我已经使用过SQL服务器了一段时间,显然我已经忘记了很多:).


Pau*_*ora 27

只是为了添加其他答案,文档给出了这样的解释:

  • KEY通常是...的同义词INDEX.键属性PRIMARY KEY也可以KEY在列定义中指定时指定.这是为了与其他数据库系统兼容而实现的.

  • 一个UNIQUE索引创建的约束,使得该指数的所有值必须是不同的.如果您尝试添加具有与现有行匹配的键值的新行,则会发生错误.对于所有引擎,UNIQUE 索引允许NULL包含的列的多个值NULL.

  • A PRIMARY KEY是唯一索引,其中必须将所有键列定义为NOT NULL.如果没有明确NOT NULL声明它们,MySQL就会隐式声明(并且默默地).一张桌子只能有一张 PRIMARY KEY.a的名称PRIMARY KEY始终为PRIMARY,因此不能用作任何其他类型索引的名称.