MySQL – 在创build表格时一起使用时,“PRIMARY KEY”,“UNIQUE KEY”和“KEY”的含义

任何人都可以解释关于PRIMARY KEYUNIQUE KEYKEY的目的,如果他们把它放在一起在MySQL中的一个单一的CREATE TABLE语句?

 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指向正确的方向。

一个唯一的键也被用来提高search速度,但是它有一个限制,就是不能有重复的项目(没有两个x和y,其中x不是y和x == y)。

手册解释如下:

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

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

本手册解释了索引如何在一般情况下使用: 这里 。

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

未经testing,但我相信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); 

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

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

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

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

  • PRIMARY KEY是一个唯一索引,其中所有键列必须定义为NOT NULL 。 如果它们没有被显式声明为NOT NULL ,那么MySQL会隐式地声明它(默默地)。 一个表只能有一个PRIMARY KEYPRIMARY KEY的名称始终为PRIMARY ,因此不能用作任何其他types索引的名称。

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/