66

任何人都可以解释 , 和 的目的PRIMARY KEYUNIQUE 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 ;

如何将此查询转换为 MSSQL?

4

3 回答 3

92

键只是一个普通的索引。一种过度简化的方法是将其想象成图书馆的卡片目录。它为 MySQL 指明了正确的方向。

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

手册解释如下:

UNIQUE 索引创建一个约束,使得索引中的所有值都必须是不同的。如果您尝试使用与现有行匹配的键值添加新行,则会发生错误。此约束不适用于 NULL 值,但 BDB 存储引擎除外。对于其他引擎,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);

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

于 2012-06-06T05:36:44.690 回答
29

只是为了添加其他答案,文档给出了以下解释:

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

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

  • APRIMARY KEY是一个唯一索引,其中所有键列都必须定义为NOT NULL。如果它们没有显式声明为NOT NULL,MySQL 会隐含地(并且默默地)声明它们。一张表只能有一个 PRIMARY KEY。a 的名称PRIMARY KEY总是PRIMARY,因此不能用作任何其他类型索引的名称。

于 2012-06-06T05:39:51.653 回答
3

MySQL 唯一键和主键用于标识行。一个表中只能有一个主键,但可以有一个或多个唯一键。键只是索引。

有关更多详细信息,您可以查看http://www.geeksww.com/tutorials/database_management_systems/mysql/tips_and_tricks/mysql_primary_key_vs_unique_key_constraints.php

将 mysql 转换为 mssql 试试这个并查看http://gathadams.com/2008/02/07/convert-mysql-to-ms-sql-server/

于 2012-06-06T05:33:11.973 回答