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

时间:2012-06-06 05:22:43

标签: mysql sql-server primary-key unique-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 ;

如何将此查询转换为MSSQL?

3 个答案:

答案 0 :(得分:89)

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

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

manual解释如下:

  

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

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

本手册解释了索引的使用方法:here

在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服务器以来已经有一段时间了,显然我已经忘记了很多:)。

答案 1 :(得分:27)

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

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

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

  • 的列的多个NULL值   
  • PRIMARY KEY是一个唯一索引,必须定义所有键列   为NOT NULL。如果它们没有显式声明为NOT NULL,那么MySQL   如此隐含地(并且默默地)声明它们。一张桌子只能有一张   PRIMARY KEYPRIMARY KEY的名称始终为PRIMARY,因此   不能用作任何其他类型索引的名称。

  •   

答案 2 :(得分: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/