Mysql学习总结(6)——MySql之ALTER命令用法详细解读

本文详细介绍MySQL中的ALTER命令,包括如何删除、添加或修改表字段,如何修改表名,以及如何进行主键和索引的修改等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MySql语法中Alter命令的用法,这是一个用法比较多的语法,而且功能还是很强大的。

[sql]  view plain copy
  1. USE learning;(自己要提前建好)  
  2. CREATE TABLE student(id INT NOT NULL,  
  3. name CHAR(10) NOT NULL,  
  4. class INT NOT NULL,  
  5. age INT  
  6. );  
来看看新建好的表

一、删除,添加或修改表字段

  • 删除表字段


如下命令使用了 ALTER 命令及 DROP 子句来删除以上创建表的 age字段:

[sql]  view plain copy
  1. ALTER TABLE student  DROP age;  
来看看结果:

如果数据表中只剩余一个字段则无法使用DROP来删除字段。

  • 添加表字段

MySQL 中使用 ADD 子句来想数据表中添加列,如下实例在表 student 中添加age字段,并定义数据类型:

[sql]  view plain copy
  1. ALTER TABLE student  ADD age INT NOT NULL;  
执行以上命令后,i 字段会自动添加到数据表字段的末尾。

SHOW COLUMNS  FROM student来看表结构

                                                             
如果你需要指定新增字段的位置,可以使用MySQL提供的关键字 FIRST (设定位第一列), AFTER 字段名(设定位于某个字段之后)。
尝试以下 ALTER TABLE 语句, 在执行成功后,使用 SHOW COLUMNS 查看表结构的变化:

[sql]  view plain copy
  1. ALTER TABLE student  ADD sex CHAR(2) FIRST;  


FIRST 和 AFTER 关键字只占用于 ADD 子句,所以如果你想重置数据表字段的位置就需要先使用 DROP 删除字段然后使用 ADD 来添加字段并设置位置。
[sql]  view plain copy
  1. ALTER TABLE student  DROP sex;  
  2. ALTER TABLE student  ADD sex CHAR(2) AFTER age;  


  • 修改表字段

修改字段类型及名称
如果需要修改字段类型及名称, 你可以在ALTER命令中使用 MODIFY 或 CHANGE 子句 。
例如,把字段 name 的类型从 CHAR(10) 改为 CHAR(100),可以执行以下命令:


[sql]  view plain copy
  1. ALTER TABLE student  MODIFY age CHAR(100);  


使用 CHANGE 子句, 语法有很大的不同。 在 CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段的类型及名称。尝试如下实例:

[sql]  view plain copy
  1. ALTER TABLE student CHANGE id  stu_id BIGINT PRIMARY KEY;  

                                               

ALTER TABLE 对 Null 值和默认值的影响
当你修改字段时,你可以指定是否包含只或者是否设置默认值。
以下实例,指定字段sex为 NOT NULL 且默认值为男 。

[sql]  view plain copy
  1. ALTER TABLE sutdent  MODIFY sex  CHAR(2)  NOT NULL DEFAULT '男';  

如果你不设置默认值,MySQL会自动设置该字段默认为 NULL。
你也可以使用 ALTER 命令及 DROP子句来删除字段的默认值,如下实例:

[sql]  view plain copy
  1. ALTER TABLE student ALTER sex DROP DEFAULT;  
  2.  SHOW COLUMNS FROM student;  

                                                              

修改数据表类型,可以使用 ALTER 命令及 TYPE 子句来完成。尝试以下实例,我们将表 student的类型修改为 MYISAM :
注意:查看数据表类型可以使用 SHOW CREATE TABLE  语句。

[sql]  view plain copy
  1. ALTER TABLE student ENGINE = MYISAM  
  2. SHOW CREATE TABLE student;  


二、修改表名

如果需要修改数据表的名称,可以在 ALTER TABLE 语句中使用 RENAME 子句来实现。
尝试以下实例将数据表 student 重命名为 student_1:


mysql> ALTER TABLE student RENAME TO student_1;


三、主键和索引修改

  • 删除表中主键

[sql]  view plain copy
  1. ALTER TABLE student  DROP PRIMARY KEY;  


  • 添加主键

[sql]  view plain copy
  1. ALTER TABLE student   ADD CONSTRAINT PK_STUDENT  PRIMARY KEY (id,class);  


添加索引

[sql]  view plain copy
  1. ALTER TABLE student ADD INDEX index_name (name);  

查看索引

[sql]  view plain copy
  1. SHOW INDEX FROM student;  


添加唯一限制条件索引

[sql]  view plain copy
  1. ALTER TABLE student  ADD UNIQUE emp_name(age);  


删除索引

ALTER TABLE student  DROP INDEX index_name;

<think>我们刚刚讨论过MySQL的BETWEEN...AND...的闭区间特性,现在用户转向询问EXPLAIN执行计划结果的含义。用户参考了四篇关于EXPLAIN执行计划的文档(引用1-4),核心诉求是理解EXPLAIN输出中各列的含义。观察用户行为:这是技术细节的深挖,用户可能正在实际优化SQL性能。需要结构化呈现EXPLAIN的关键输出字段,并结合示例帮助理解。重点规划:1.开篇说明EXPLAIN的作用——展示SQL执行计划的关键信息(引用1/2/3的核心观点)2.用表格罗列EXPLAIN的主要输出列(id/select_type/table等),每列需包含含义和典型值3.对关键列(如type/Extra)作更细致的解释,因它们直接反映性能痛点4.补充一个具体示例,展示如何解读实际输出5.注意系统指令要求:数学公式用LaTeX格式,中英文混排时保持专业术语准确特别考虑:引用文档[4]提到"explainselect(select1fromactorwhereid=1)from(select*fromfilmwhereid=1)dd"这样的嵌套查询,解读时需注意id列和select_type列的关联性。最终结构:一、EXPLAIN命令概述(作用+用法)二、输出列详解表格(10个核心字段)三、重点字段深度解析(type/Extra的等级说明)四、示例解读五、总结建议</think> ### 📊 MySQL EXPLAIN执行计划结果详解 EXPLAIN命令用于分析SQL语句的执行计划,帮助优化查询性能。以下是其输出结果的核心字段详解(基于引用[1][2][3][4]): #### 一、核心字段解析 | **字段名** | **含义** | **典型值/说明** | |------------------|--------------------------------------------------------------------------|-------------------------------------------------------------------------------| | **id** | 查询的序列号(执行顺序) | 数值相同按顺序执行;不同时,值越大优先级越高 | | **select_type** | 查询类型 | `SIMPLE`(简单查询)、`PRIMARY`(外层查询)、`SUBQUERY`(子查询)等 [^3] | | **table** | 访问的表名 | 若为衍生表则显示`<derivedN>`(N为id值) | | **type** 🔑 | **访问类型**(性能关键) | `ALL`(全表扫描)→`index`→`range`→`ref`→`eq_ref`→`const`(性能依次升高)[^1] | | **key** | 实际使用的索引 | 若为`NULL`表示未用索引 | | **rows** | 预估扫描行数 | 值越大性能越差,需优化索引 | | **Extra** 🔍 | **额外信息**(重要优化线索) | ▶ `Using where`: 使用WHERE过滤<br>▶ `Using index`: 覆盖索引<br>▶ `Using temporary`: 用临时表<br>▶ `Using filesort`: 额外排序 | #### 二、关键字段深度解析 1. **type字段等级**(性能从低到高): $$ \text{ALL} \to \text{index} \to \text{range} \to \text{ref} \to \text{eq\_ref} \to \text{const} $$ - **range**:索引范围扫描(如`BETWEEN`、`IN()`) - **const**:通过主键/唯一索引找到一行(最优) 2. **Extra字段常见值**: - `Using filesort`: 表示需额外排序(如`ORDER BY`非索引列),可通过创建复合索引优化: ```sql -- 优化前(可能触发filesort) SELECT * FROM orders ORDER BY create_time; -- 优化后(复合索引避免排序) ALTER TABLE orders ADD INDEX idx_create_time (create_time); ``` - `Using temporary`: 需创建临时表(常见于`GROUP BY`非索引列),可通过索引优化。 #### 三、示例解读 ```sql EXPLAIN SELECT * FROM users WHERE age BETWEEN 18 AND 30 ORDER BY name; ``` | id | select_type | table | type | key | rows | Extra | |----|-------------|-------|-------|---------|------|----------------| | 1 | SIMPLE | users | range | idx_age | 1000 | Using filesort | **解读**: 1. 使用索引`idx_age`进行范围扫描(`type=range`) 2. 但`ORDER BY name`导致额外排序(`Using filesort`) 3. **优化建议**:创建复合索引 `(age, name)` #### 四、最佳实践 1. **优先关注**: - `type` 避免出现 `ALL`(全表扫描) - `Extra` 避免 `Using filesort` 和 `Using temporary` 2. **索引优化**: - 对`WHERE`、`JOIN`、`ORDER BY`涉及的列创建复合索引 - 使用覆盖索引(`Extra`显示`Using index`)减少回表查询 > 通过执行计划可定位性能瓶颈。例如`rows`值突增时需检查索引失效,`type`降级时需调整查询条件[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值