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

Posted

技术标签:

【中文标题】MySQL - 创建表时一起使用“PRIMARY KEY”、“UNIQUE KEY”和“KEY”的含义【英文标题】:MySQL - Meaning of "PRIMARY KEY", "UNIQUE KEY" and "KEY" when used together while creating a table 【发布时间】:2012-06-10 03:14:29 【问题描述】:

如果将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?

【问题讨论】:

相关:mySQL's KEY keyword? 基本上KEYINDEX 的同义词。 【参考方案1】:

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

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

manual 解释如下:

一个 UNIQUE 索引创建一个约束,使得索引中的所有值 必须是不同的。如果您尝试添加一个带有 与现有行匹配的键值。此约束不适用 除 BDB 存储引擎外,为 NULL 值。对于其他发动机,一个 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 Server 以来已经有一段时间了,显然我已经忘记了很多:)。

【讨论】:

很好的解释!代码也运行良好。非常感谢! 没问题。很高兴我能帮忙:)。 感谢您在手册中指出我正确的位置! 太棒了!此链接将参考主键事物中 MySQL 和 SQL 的类型。 w3schools.com/sql/sql_primarykey.asp【参考方案2】:

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

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

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

PRIMARY KEY 是必须定义所有键列的唯一索引 作为NOT NULL。如果它们没有明确声明为NOT NULL,MySQL 如此含蓄地(并且默默地)声明它们。一个表只能有一个 PRIMARY KEYPRIMARY KEY 的名称始终为 PRIMARY,因此 不能用作任何其他类型索引的名称。

【讨论】:

与其他数据库系统的兼容性?还有哪些其他 DBMS 使用“KEY”这个词来表示根本不是键的东西(索引)?我一直认为这只是 MySQL 的一些奇怪之处——而且 MySQL 的作者实际上并不知道 key 是什么:) 每个后续定义是否包含上一个定义的所有属性。例如:“UNIQUE KEY”也是“KEY”吗?【参考方案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/

【讨论】:

@Paul Bellora ,你的解释比我的更清楚。太好了。 好吧,我只是引用了文档,我没有看到关于转换的第二部分。我认为 Corbin 的回答总结得很好。

以上是关于MySQL - 创建表时一起使用“PRIMARY KEY”、“UNIQUE KEY”和“KEY”的含义的主要内容,如果未能解决你的问题,请参考以下文章

sql server建表时怎么设置ID字段自增

每次登录表时,我如何进行 mysql 查询以查找用户,以及与他一起的所有其他用户,按日期和时间过滤

sparksql建表时java.sql.BatchUpdateException: Duplicate entry ‘‘ for key ‘PRIMARY‘

sparksql建表时java.sql.BatchUpdateException: Duplicate entry ‘‘ for key ‘PRIMARY‘

sparksql建表时java.sql.BatchUpdateException: Duplicate entry ‘‘ for key ‘PRIMARY‘

如何在 postgres 中集群我的 PRIMARY KEY