MySQL 中真正修改表,要靠这几个 DDL 命令

MySQL 中真正修改表,要靠这几个 DDL 命令

很多刚学数据库的人,最容易把两件事混在一起:

看起来都叫“修改”,但本质完全不是一回事。

比如:

如果你连这两类操作都没分清,后面写 SQL 很容易把自己绕进去。

今天这篇文章,我们就从实战角度,把 MySQL 中修改表结构、删除列、修改列定义、删除整张表这一套 DDL 操作讲清楚。

不空讲概念,直接配代码、运行结果和典型坑点。

一、先搞清楚:你改的是“数据”,还是“表”

数据库里常见的 SQL 操作,可以粗分为两类:

1)DML:操作数据

这类语句主要针对表里的记录,比如:

例子:

UPDATE t_student SET s_age = 20 WHERE s_no = 1;

这叫改数据,不叫改表。

2)DDL:操作数据库对象

这类语句针对的是数据库对象本身,比如:

常见命令有:

例子:

ALTER TABLE t_student ADD score DOUBLE(5,2);

这叫修改表结构,属于 DDL。

二、修改表结构sql删除表中数据,核心就是 ALTER TABLE

在 MySQL 里,改表结构最常用的命令就是:

ALTER TABLE 表名 ...

后面根据你的需求,可以继续接:

所以你可以把 ALTER TABLE 理解成一句总开关:

我要开始动这张表本身了。

三、给表新增一列:ADD 才是正确打开方式

假设现在有一张学生表 ,结构如下:

CREATE TABLE t_student (
    s_no INT(6),
    s_name VARCHAR(20),
    s_sex CHAR(1),
    s_age INT,
    enter_date DATE,
    class_name VARCHAR(30),
    email VARCHAR(50)
);

先查一下表中的数据:

SELECT * FROM t_student;

运行结果示例:

+------+--------+-------+-------+------------+------------+------------------+
| s_no | s_name | s_sex | s_age | enter_date | class_name | email            |
+------+--------+-------+-------+------------+------------+------------------+
|    1 | 张三   | 男    |    18 | 2022-05-08 | 软件一班   | 123@126.com      |
|    2 | 李四   | 女    |    19 | 2022-05-08 | 软件二班   | li4@126.com      |
+------+--------+-------+-------+------------+------------+------------------+

现在我们想增加一列“成绩”。

1)新增一列的基本写法

ALTER TABLE t_student
ADD score DOUBLE(5,2);

运行结果:

Query OK, 0 rows affected

再次查询表结构或直接查看数据:

SELECT * FROM t_student;

运行结果示例:

+------+--------+-------+-------+------------+------------+------------------+-------+
| s_no | s_name | s_sex | s_age | enter_date | class_name | email            | score |
+------+--------+-------+-------+------------+------------+------------------+-------+
|    1 | 张三   | 男    |    18 | 2022-05-08 | 软件一班   | 123@126.com      | NULL  |
|    2 | 李四   | 女    |    19 | 2022-05-08 | 软件二班   | li4@126.com      | NULL  |
+------+--------+-------+-------+------------+------------+------------------+-------+

你会发现:

这是正常现象,因为以前压根没有这一列。

2)(5,2) 到底什么意思?

比如:

score DOUBLE(5,2)

含义是:

例如这些值是合法的:

如果你插入更长的小数,MySQL 会按字段定义做处理。

四、加完新列后,数据会怎么存?看一个精度案例就明白了

现在 score 列已经有了,我们给某个学生写入成绩。

UPDATE t_student
SET score = 123.5678
WHERE s_no = 1;

运行结果:

Query OK, 1 row affected

查询:

SELECT s_no, s_name, score FROM t_student WHERE s_no = 1;

运行结果:

+------+--------+--------+
| s_no | s_name | score  |
+------+--------+--------+
|    1 | 张三   | 123.57 |
+------+--------+--------+

为什么是 123.57?

因为前面定义的是:

DOUBLE(5,2)

小数只保留 2 位,所以会发生四舍五入。

这对开发和安全有什么提醒?

如果你在数据库里存的是:

字段精度没设计好,就可能导致数据在落库时被自动截断或四舍五入,后面做统计、告警阈值判断时会出偏差。

五、新增列不一定只能加在最后,位置也能控制

很多人以为:

ADD 新列默认只能加到最后。

其实不是。

MySQL 支持你指定列的位置。

常见两种方式:

1)把新列放到第一列

先删除 score 列,再重新添加到最前面。

删除列:

ALTER TABLE t_student
DROP COLUMN score;

运行结果:

Query OK, 0 rows affected

添加到第一列:

ALTER TABLE t_student
ADD score DOUBLE(5,2) FIRST;

查询:

SELECT * FROM t_student;

运行结果示例:

+-------+------+--------+-------+-------+------------+------------+------------------+
| score | s_no | s_name | s_sex | s_age | enter_date | class_name | email            |
+-------+------+--------+-------+-------+------------+------------+------------------+
|  NULL |    1 | 张三   | 男    |    18 | 2022-05-08 | 软件一班   | 123@126.com      |
|  NULL |    2 | 李四   | 女    |    19 | 2022-05-08 | 软件二班   | li4@126.com      |
+-------+------+--------+-------+-------+------------+------------+------------------+

可以看到,score 已经到了第一列。

2)把新列放到指定字段后面

假设你想把 score 放到 s_sex 和 s_age 之间,也就是放在 s_sex 后面:

先删掉:

ALTER TABLE t_student
DROP COLUMN score;

再重新加:

ALTER TABLE t_student
ADD score DOUBLE(5,2) AFTER s_sex;

查询结果示例:

+------+--------+-------+-------+-------+------------+------------+------------------+
| s_no | s_name | s_sex | score | s_age | enter_date | class_name | email            |
+------+--------+-------+-------+-------+------------+------------+------------------+
|    1 | 张三   | 男    | NULL  |    18 | 2022-05-08 | 软件一班   | 123@126.com      |
|    2 | 李四   | 女    | NULL  |    19 | 2022-05-08 | 软件二班   | li4@126.com      |
+------+--------+-------+-------+-------+------------+------------+------------------+

六、删除一列:DROP 不是清空,是直接移除

删除列的语法如下:

ALTER TABLE 表名
DROP COLUMN 列名;

例如删除成绩列:

ALTER TABLE t_student
DROP COLUMN score;

运行结果:

Query OK, 0 rows affected

再次查询:

SELECT * FROM t_student;

你会发现 score 列彻底没了。

这里要特别注意

删除列和把列值改成 NULL 是两回事:

这属于结构级删除sql删除表中数据,操作前最好确认:

否则你删完一列,业务代码可能直接报错。

七、修改列定义: 和 ,很多人总分不清

这是 MySQL 改表结构里最容易搞混的一组命令:

两者都能“改列”,但能力不一样。

1):只改列定义,不改列名

例如,我们现在有:

score DOUBLE(5,2)

想把它改成:

FLOAT(4,1)

可以这么写:

ALTER TABLE t_student
MODIFY score FLOAT(4,1);

运行结果:

Query OK, 2 rows affected

如果原来某条记录中:

123.57

再查时可能会变成:

123.6

因为现在字段定义成了:

FLOAT(4,1)

只保留 1 位小数。

示例:修改类型后的数据变化

先写入一条数据:

UPDATE t_student
SET score = 123.57
WHERE s_no = 1;

然后修改列类型:

ALTER TABLE t_student
MODIFY score FLOAT(4,1);

查询结果:

SELECT s_no, score FROM t_student WHERE s_no = 1;

运行结果:

+------+-------+
| s_no | score |
+------+-------+
|    1 | 123.6 |
+------+-------+

说明 MySQL 会按新类型尝试转换已有数据。

2):既能改列名,也能改列定义

如果你不仅想改类型,还想顺手把列名改掉,比如把 score 改成 ,可以用:

ALTER TABLE t_student
CHANGE score score1 DOUBLE(5,1);

这个语句的结构要注意:

CHANGE 旧列名 新列名 新数据类型

也就是说, 必须把老名字和新名字都写出来。

八、为什么 会报 out of range?因为你改小了,旧数据装不下

看一个典型报错。

假设当前 score 的值是:

123.6

你现在执行:

ALTER TABLE t_student
CHANGE score score1 DOUBLE(3,1);

很可能直接报错:

ERROR 1264 (22003): Out of range value for column 'score1' at row 1

原因是什么?

因为:

DOUBLE(3,1)

表示总位数只有 3 位MySQL 中真正修改表,要靠这几个 DDL 命令,其中小数占 1 位。

那你真正能表示的数很有限,比如:

但你当前表里已经有:

123.6

它根本放不进去sql删除表中数据,所以报:

Out of range

正确做法

改成能容纳当前数据的类型,例如:

ALTER TABLE t_student
CHANGE score score1 DOUBLE(5,1);

运行结果:

Query OK, 2 rows affected

查询:

SELECT s_no, score1 FROM t_student;

运行结果:

+------+--------+
| s_no | score1 |
+------+--------+
|    1 |  123.6 |
|    2 |   NULL |
+------+--------+

这样就成功了。

九、删表和删数据,不是一个量级的操作

这是很多初学者最容易搞错的地方之一。

1)删除数据

比如:

DELETE FROM t_student;

这会删除表中的所有记录,

但表结构还在。

2)删除表

如果你执行:

DROP TABLE t_student;

那就不是删数据了,而是把整张表对象直接删除:

示例:删除整张表

DROP TABLE t_student;

运行结果:

Query OK, 0 rows affected

然后你再查:

SELECT * FROM t_student;

运行结果:

ERROR 1146 (42S02): Table 'mytestdb.t_student' doesn't exist

这个错误码 1146 的核心意思就是:

表不存在了。

十、MySQL 语法记不住怎么办?别死背,学会查文档才是正路

很多人一看到:

就开始慌。

其实数据库学习到后面,你会发现一个真相:

没人靠死记硬背吃饭,真正重要的是知道“去哪里查”和“怎么判断该用哪个命令”。

尤其 ALTER TABLE 的语法扩展很多MySQL 中真正修改表,要靠这几个 DDL 命令,除了本文讲的这些,还包括:

这些内容不可能全靠脑子硬背。

正确学习方式

记住这几点就够了:

1)先掌握核心骨架

比如你得知道:

2)遇到细节再查文档

比如:

这些都可以查官方文档或可靠资料。

3)先理解,不要硬背

理解“为什么要这样改”,比背 10 条语法更重要。

十一、从网络安全角度看,为什么表结构修改也很重要?

很多人觉得改表结构只是开发人员的事。

其实在安全工作里,这类能力也很常用。

1)审计日志表扩展字段

比如你原来只有:

后面为了安全分析,想加上:

这时候就需要 ALTER TABLE ADD。

2)调整字段精度,避免误判

例如安全评分字段如果精度太低,可能导致:

这时候就要改字段类型。

3)清理历史无用字段

随着业务变化,一些旧字段不再使用,留着反而造成:

这时候要用 DROP 。

4)误删表比误删数据更严重

很多测试环境混着正式数据,

一条 DROP TABLE 下去,损失可比 大得多。

十二、完整实战案例:从加列到改列再到删表

下面给你一组完整 SQL,适合直接练习。

-- 1. 创建测试表
CREATE TABLE t_student (
    s_no INT(6),
    s_name VARCHAR(20),
    s_sex CHAR(1),
    s_age INT,
    enter_date DATE,
    class_name VARCHAR(30),
    email VARCHAR(50)
);
-- 2. 插入测试数据
INSERT INTO t_student VALUES
(1, '张三', '男', 18, '2022-05-08', '软件一班', '123@126.com'),
(2, '李四', '女', 19, '2022-05-09', '软件二班', 'li4@126.com');
-- 3. 增加成绩列
ALTER TABLE t_student
ADD score DOUBLE(5,2) AFTER s_sex;
-- 4. 更新成绩
UPDATE t_student
SET score = 123.5678
WHERE s_no = 1;
-- 5. 查看结果
SELECT * FROM t_student;
-- 6. 修改列类型
ALTER TABLE t_student
MODIFY score FLOAT(4,1);
-- 7. 查看结果
SELECT s_no, score FROM t_student;
-- 8. 修改列名和类型
ALTER TABLE t_student
CHANGE score score1 DOUBLE(5,1);
-- 9. 查看结果
SELECT s_no, score1 FROM t_student;
-- 10. 删除列
ALTER TABLE t_student
DROP COLUMN score1;
-- 11. 删除整张表
DROP TABLE t_student;

部分运行结果示例更新成绩后:

+------+--------+-------+--------+-------+------------+------------+------------------+
| s_no | s_name | s_sex | score  | s_age | enter_date | class_name | email            |
+------+--------+-------+--------+-------+------------+------------+------------------+
|    1 | 张三   | 男    | 123.57 |    18 | 2022-05-08 | 软件一班   | 123@126.com      |
|    2 | 李四   | 女    | NULL   |    19 | 2022-05-09 | 软件二班   | li4@126.com      |
+------+--------+-------+--------+-------+------------+------------+------------------+

修改为 FLOAT(4,1) 后:

+------+-------+
| s_no | score |
+------+-------+
|    1 | 123.6 |
|    2 | NULL  |
+------+-------+

删除表后再查询:

ERROR 1146 (42S02): Table 'mytestdb.t_student' doesn't exist

十三、总结:搞懂这 6 个命令,表结构操作就算入门了

如果你只想先抓重点,那记住下面这 6 条就够了:

改表结构,核心命令是 ALTER TABLE。新增列用 ADD。删除列用 DROP 。只改列定义,用 。改列名同时改定义,用 。删除整张表,用 DROP TABLE,这一步最危险。

公告:
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299

资源库 - 资源分享下载网 » MySQL 中真正修改表,要靠这几个 DDL 命令

常见问题FAQ

关于资源售价和售后服务的说明?
本站所有资源的标价均为本站收集资源的辛苦费,不代表资源本身的价值。软件是高智慧高价值的商品,不可能是白菜价。本站资源标价只是赞助费用,收取的赞助费仅用来维持本站的日常运营!毕竟收集整理资料需要投入云计算资源和站长大量的精力。
代码有没有售后服务和技术支持?
由于代码的运行具有不可预见性,本站不保证代码完整可运行,不提供技术支持和售后服务。 本站原创代码都是站长自己开发的,可以有偿提供技术支持服务。 网站里标明【亲测】的代码都是站长亲测过的,其他的代码由于精力有限,没有一一测试,不能保证代码就一定能够使用,更没有技术支持服务,下载前请自行斟酌。
有没有搭建服务?
由于搭建服务比较费时费力,所以本站除了原创代码外均不提供搭建服务。本站分享代码纯属兴趣爱好,不以盈利为目的,请勿咨询有没有搭建服务,谢谢理解。
链接地址失效了怎么办?
请带上资源链接地址联系客服,工作时间内我们看到后将第一时间回复。
关于解压密码
本站资源一般都没有加密,如果发现需要解压密码的,那么就输入 hao.35dc.com 试试。

发表评论

资源库,由老程序员细心甄别、精心筛选,只为提供优质的源码资源

关于我们 联系我们