关于mysql中的key和index

本文详细解释了MySQL中主键与索引的区别、作用及创建方式,包括如何选择合适的主键,以及如何利用索引来优化查询效率。

1. 官方文档:http://dev.mysql.com/doc/refman/5.5/en/create-table.html

  • KEY is normally a synonym for INDEX. The key attribute PRIMARY KEY can also be specified as just KEY when given in a column definition. This was implemented for compatibility with other database systems.

  • UNIQUE index creates a constraint such that all values in the index must be distinct. An error occurs if you try to add a new row with a key value that matches an existing row. For all engines, a UNIQUE index permits multipleNULL values for columns that can contain NULL.

  •  A PRIMARY KEY is a unique index where all key columns must be defined as NOT NULL. If they are not explicitly declared as NOT NULL, MySQL declares them so implicitly (and silently). A table can have only one PRIMARY KEY. The name of a PRIMARY KEY is always PRIMARY, which thus cannot be used as the name for any other kind of index.

    If you do not have a PRIMARY KEY and an application asks for the PRIMARY KEY in your tables, MySQL returns the first UNIQUE index that has no NULL columns as the PRIMARY KEY.

    In InnoDB tables, keep the PRIMARY KEY short to minimize storage overhead for secondary indexes. Each secondary index entry contains a copy of the primary key columns for the corresponding row. (SeeSection 14.3.11, “InnoDB Table and Index Structures”.)

  • In the created table, a PRIMARY KEY is placed first, followed by all UNIQUE indexes, and then the nonunique indexes. This helps the MySQL optimizer to prioritize which index to use and also more quickly to detect duplicatedUNIQUE keys.

  • PRIMARY KEY can be a multiple-column index. However, you cannot create a multiple-column index using thePRIMARY KEY key attribute in a column specification. Doing so only marks that single column as primary. You must use a separate PRIMARY KEY(index_col_name, ...) clause.

  •  If a PRIMARY KEY or UNIQUE index consists of only one column that has an integer type, you can also refer to the column as _rowid in SELECT statements.

  • In MySQL, the name of a PRIMARY KEY is PRIMARY. For other indexes, if you do not assign a name, the index is assigned the same name as the first indexed column, with an optional suffix (_2_3...) to make it unique. You can see index names for a table using SHOW INDEX FROM tbl_name. See Section 13.7.5.23, “SHOW INDEXSyntax”.

2. http://forums.macrumors.com/showthread.php?t=334697

Note that "primary" is called PRIMARY KEY not INDEX. 
KEY is something on the logical level, describes your table and database design (i.e. enforces referential integrity ...)
INDEX is something on the physical level, helps improve access time for table operations.
Behind every PK there is (usually) unique index created (automatically).

3. http://wenku.baidu.com/view/ff96febb1a37f111f1855bf8.html

在创建innoDB表时,在每张表中都只能有一个主键,如果在创建表时没有明确地定义主键(Primary Key),则innoDB引擎会自动按照如下方式选择或创建主键:首先看表中是否有非空唯一索引(Unique NOT NULL)如果有,则该列即为主键。 不符合上述条件,则自动创建一个6字节大小的RowID。
<think>首先,用户的问题是:“我想查找在MySQL中删除主键(primary key索引(key)的方法 请问MySQL中删除primary keykey的方法”。所以,我需要提供删除主键索引的方法。 从系统级指令中,我知道: - 所有行内数学表达式必须使用$...$格式。 - 独立公式使用$$...$$格式。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题。 用户提供了三个引用: - 引用[1]:解释了KEYPRIMARY KEYUNIQUE KEY的区别,提到PRIMARY KEY是唯一KEY,必须NOT NULL。 - 引用[2]:显示了在插入时处理PRIMARY KEY重复的SQL语句。 - 引用[3]:详细比较了PRIMARY KEYUNIQUE KEY的差异,包括允许NULL值、索引类型等。 但这些引用是关于KEYPRIMARY KEY的定义区别的,而不是直接关于删除方法的。用户说“上述引用仅供参考”,所以我应该专注于用户的问题,即删除主键索引的方法。 用户的问题核心是删除操作: - 删除主键(PRIMARY KEY) - 删除索引(KEY) 在MySQL中: - 删除PRIMARY KEY:需要使用ALTER TABLE语句来删除主键约束。 - 删除索引:索引可以是KEYINDEX、UNIQUE INDEX等,使用DROP INDEX语句或ALTER TABLE语句。 回想MySQL语法: 1. 删除主键: - 语法:`ALTER TABLE table_name DROP PRIMARY KEY;` - 注意:如果表有自增列作为主键,删除主键可能需要先改变列。 2. 删除索引: - 语法:`ALTER TABLE table_name DROP INDEX index_name;` - 或者:`DROP INDEX index_name ON table_name;` 用户提到的“KEY”在MySQL中通常指的是索引。引用[1]说“KEY 通常是 INDEX 同义词”,所以删除KEY就是删除索引。 步骤: - 确认表名索引名。 - 使用适当的SQL语句。 在回答中: - 结构清晰:逐步解释。 - 使用中文。 - 添加引用标识:由于引用是提供的,我需要在相关内容后引用它们。虽然引用不是直接关于删除方法的,但它们提供背景。用户说“上述引用仅供参考”,所以我可以引用它们来辅助解释,但主要焦点是删除方法。 可能的引用点: - 当解释PRIMARY KEY的特性时,引用[1]或[3]。 - 但删除方法本身可能没有在引用中直接给出,所以我需要基于一般知识回答。 生成相关问题:指令要求“生成相关问题”,并在示例中显示在回答末尾添加“§§相关问题§§”部分。 回答结构: 1. 简要介绍删除主键索引的重要性或背景。 2. 详细说明删除PRIMARY KEY的方法。 3. 详细说明删除索引(KEY)的方法。 4. 提供示例代码或语句。 5. 添加注意事项。 6. 末尾生成相关问题。 确保LaTeX:用户的问题中没有数学表达式,所以可能不需要使用$...$或$$...$$。但如果有,比如在解释公式时,但我认为这里不需要。 现在,构建回答: - 开头:直接回答问题。 - 步骤: - 删除PRIMARY KEY: - 语法:`ALTER TABLE table_name DROP PRIMARY KEY;` - 注意:如果主键是自增列,需要先处理自增属性。 - 删除索引(KEY): - 语法:`ALTER TABLE table_name DROP INDEX index_name;` - 或者 `DROP INDEX index_name ON table_name;` - 需要知道索引名称。 - 示例:提供简单的SQL示例。 - 引用:当提到KEYPRIMARY KEY的定义时,引用提供的引用。 例如: - 当解释PRIMARY KEY时,可以说:“PRIMARY KEY 是一个唯一 KEY,用于唯一标识表中的每一行,并且不能为 NULL [^1][^3]。” - 但删除操作不需要太多定义,所以可能只在必要时引用。 生成相关问题: - 类似于示例,列出3个左右相关问题。 - 例如: 1. 如何添加PRIMARY KEY到表中? 2. 如何查看表中的索引? 3. 删除主键后如何恢复? 完整回答框架: 1. 介绍:在MySQL中,删除主键索引是常见的数据库维护操作。 2. 删除PRIMARY KEY: - 描述语法。 - 注意事项。 3. 删除索引: - 描述语法。 - 如何查找索引名称。 4. 示例:提供SQL代码块。 5. 注意事项总结。 6. 相关问题。 最终回答: - 使用中文。 - 代码块用于SQL语句。 - 结束于相关问题。 </think> ### MySQL中删除主键(PRIMARY KEY索引(KEY)的方法 在MySQL中,删除主键(PRIMARY KEY索引(KEY)是数据库维护的常见操作。主键用于唯一标识表中的每一行,不能为NULL;索引(KEY)用于提高查询效率,可以是普通索引或唯一索引[^3]。删除这些元素时,需使用`ALTER TABLE`语句。下面我将逐步解释具体方法,并提供示例。 #### 1. **删除主键(PRIMARY KEY)** - **语法**: ```sql ALTER TABLE table_name DROP PRIMARY KEY; ``` - `table_name`:目标表的名称。 - **注意事项**: - 如果主键列是自增(AUTO_INCREMENT)列,删除主键前需要先移除自增属性,否则会报错。可使用以下语句修改列: ```sql ALTER TABLE table_name MODIFY column_name datatype; -- 移除AUTO_INCREMENT ``` - 删除主键后,该列的`NOT NULL`约束可能保留,需手动处理[^3]。 - 一个表只能有一个主键,删除后可以重新添加新主键。 - **示例**: 假设表`users`有主键`id`: ```sql -- 先移除自增属性(如果存在) ALTER TABLE users MODIFY id INT; -- 删除主键 ALTER TABLE users DROP PRIMARY KEY; ``` #### 2. **删除索引(KEY)** - **索引类型**:索引包括普通索引(INDEX)、唯一索引(UNIQUE KEY)等。KEY 通常是 INDEX 的同义词,在MySQL中可以互换使用。 - **语法**: 有两种等效方式: ```sql ALTER TABLE table_name DROP INDEX index_name; ``` 或 ```sql DROP INDEX index_name ON table_name; ``` - `table_name`:目标表的名称。 - `index_name`:索引的名称(需提前知道)。 - **如何查找索引名称**: 使用`SHOW INDEX FROM table_name;`命令查看所有索引及其名称。 - **注意事项**: - 删除索引不会删除列数据,只影响查询性能。 - 如果索引是唯一索引(UNIQUE KEY),删除后允许列中出现重复值(除非有其他约束)[^3]。 - 主键也是一种索引(聚集索引),但删除时需用`DROP PRIMARY KEY`而非`DROP INDEX`[^3]。 - **示例**: 假设表`users`有索引`idx_username`: ```sql -- 先查看索引 SHOW INDEX FROM users; -- 删除索引 ALTER TABLE users DROP INDEX idx_username; -- 或 DROP INDEX idx_username ON users; ``` #### 3. **综合示例与注意事项** - **完整操作示例**: 删除表`employees`的主键索引`idx_email`: ```sql -- 删除主键 ALTER TABLE employees DROP PRIMARY KEY; -- 删除索引 DROP INDEX idx_email ON employees; ``` - **重要提醒**: - **备份数据**:在执行删除操作前,建议备份表数据,避免意外丢失。 - **性能影响**:删除索引可能降低查询速度;删除主键可能影响外键约束(如果存在),需检查并处理相关依赖。 - **错误处理**:如果索引不存在或名称错误,MySQL会报错。使用`SHOW INDEX`确认名称。 - 在插入数据时处理主键冲突的方法(如`ON DUPLICATE KEY UPDATE`)[^2],在删除后不再适用。 通过上述步骤,您可以安全地删除主键索引。如果需要进一步优化或恢复,请参考MySQL官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值