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 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 ;
如何将此查询转换为 MSSQL?
【问题讨论】:
相关:mySQL's KEY keyword? 基本上KEY
是INDEX
的同义词。
【参考方案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 KEY
。PRIMARY 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”的含义的主要内容,如果未能解决你的问题,请参考以下文章
每次登录表时,我如何进行 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‘