MySQL – 在创build表格时一起使用时,“PRIMARY KEY”,“UNIQUE KEY”和“KEY”的含义
任何人都可以解释关于PRIMARY KEY
, UNIQUE KEY
和KEY
的目的,如果他们把它放在一起在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 KEY
。PRIMARY KEY
的名称始终为PRIMARY
,因此不能用作任何其他types索引的名称。
MySQL唯一键和主键用于标识行。 表中只能有一个主键,但有一个或多个唯一键。 关键只是索引。
把mysql转换成mssql试试看看http://gathadams.com/2008/02/07/convert-mysql-to-ms-sql-server/