首页 > 数据库 >MySQL-17-mysql alter 语句如何实现?如何合并为一个

MySQL-17-mysql alter 语句如何实现?如何合并为一个

时间:2024-07-07 17:19:06浏览次数:16  
标签:语句 17 COLUMN MySQL students mysql TABLE ALTER

拓展阅读

MySQL 00 View

MySQL 01 Ruler mysql 日常开发规范

MySQL 02 truncate table 与 delete 清空表的区别和坑

MySQL 03 Expression 1 of ORDER BY clause is not in SELECT list,references column

MySQL 04 EMOJI 表情与 UTF8MB4 的故事

MySQL 05 MySQL入门教程(MySQL tutorial book)

MySQL 06 mysql 如何实现类似 oracle 的 merge into

MySQL 07 timeout 超时异常

MySQL 08 datetime timestamp 以及如何自动更新,如何实现范围查询

MySQL 09 MySQL-09-SP mysql 存储过程

MySQL 09 MySQL-group by 分组

需求

表在上线以后,我们需要对表进行 alter 字段处理

实现方式

mysql 如何通过 alter 添加一个字段?如何修改一个字段?

实际测试

mysql> select @@version;
+------------+
| @@version  |
+------------+
| 5.7.31-log |
+------------+

创建一张测试表

CREATE TABLE students (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    age INT
);

添加字段

alter table students add column create_time datetime(6) comment '创建时间';

测试效果

mysql> alter table students add column create_time datetime(6) comment '创建时间';
Query OK, 0 rows affected (0.08 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql>
mysql> desc students;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| name        | varchar(100) | YES  |     | NULL    |                |
| age         | int(11)      | YES  |     | NULL    |                |
| create_time | datetime(6)  | YES  |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

修改字段

ALTER TABLE students MODIFY COLUMN name VARCHAR(256);

实际测试效果:

mysql> ALTER TABLE students MODIFY COLUMN name VARCHAR(256);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc students;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| name        | varchar(256) | YES  |     | NULL    |                |
| age         | int(11)      | YES  |     | NULL    |                |
| create_time | datetime(6)  | YES  |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

修改字段名称+属性

如果我们希望修改字段名称,需要使用 CHANGE COLUMN

ALTER TABLE students CHANGE COLUMN create_time created_time datetime(3) COMMENT '创建时间';

实际测试效果如下:

mysql> ALTER TABLE students CHANGE COLUMN create_time created_time datetime(3) COMMENT '创建时间';
Query OK, 0 rows affected (0.09 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc students;
+--------------+--------------+------+-----+---------+----------------+
| Field        | Type         | Null | Key | Default | Extra          |
+--------------+--------------+------+-----+---------+----------------+
| id           | int(11)      | NO   | PRI | NULL    | auto_increment |
| name         | varchar(256) | YES  |     | NULL    |                |
| age          | int(11)      | YES  |     | NULL    |                |
| created_time | datetime(3)  | YES  |     | NULL    |                |
+--------------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

场景2:如何把同一个表的多个 alter 语句合并为 1 个?

在 MySQL 中,你可以将多个 ALTER TABLE 语句合并为一个,以提高效率和减少表锁定时间。这是通过在一个 ALTER TABLE 语句中指定多个修改来实现的。每个修改用逗号分隔。

假设你有以下多个 ALTER TABLE 语句:

ALTER TABLE my_table ADD COLUMN new_column1 VARCHAR(100);
ALTER TABLE my_table MODIFY COLUMN existing_column VARCHAR(256);
ALTER TABLE my_table ADD COLUMN new_column2 INT;
ALTER TABLE my_table DROP COLUMN old_column;

你可以将它们合并为一个 ALTER TABLE 语句,如下所示:

ALTER TABLE my_table
ADD COLUMN new_column1 VARCHAR(100),
MODIFY COLUMN existing_column VARCHAR(256),
ADD COLUMN new_column2 INT,
DROP COLUMN old_column;

示例

假设你有一个名为 students 的表,你想执行以下修改:

  1. 添加一个名为 email 的字段,类型为 VARCHAR(255)
  2. 修改 name 字段的长度为 VARCHAR(256)
  3. 添加一个名为 birthdate 的字段,类型为 DATE
  4. 删除一个名为 old_field 的字段。

将这些操作合并为一个 ALTER TABLE 语句:

ALTER TABLE students
ADD COLUMN email VARCHAR(255),
MODIFY COLUMN name VARCHAR(256),
ADD COLUMN birthdate DATE,
DROP COLUMN old_field;

注意事项

  1. 顺序问题:在某些情况下,操作的顺序可能很重要。例如,如果你要修改一个字段的名称然后更改其类型,确保先重命名再修改类型。
  2. 兼容性问题:确保所有操作在一个 ALTER TABLE 语句中执行时不会互相冲突。例如,删除一个字段然后再添加同名字段在同一个语句中可能会出问题。
  3. 备份数据:在对表结构进行重大更改之前,最好备份数据,以防出现意外情况。

合并 ALTER TABLE 语句不仅可以提高执行效率,还可以减少数据库表的锁定时间,尤其是在处理大表时,这一点尤为重要。

为什么需要合并为一个?

将多个 ALTER TABLE 语句合并为一个有以下几个主要原因和好处:

1. 减少表锁定时间

每个 ALTER TABLE 操作都会对表进行锁定,阻止其他操作在同一时间修改表结构。多个 ALTER TABLE 语句将导致多次锁定表,增加锁定时间。而将多个修改合并为一个 ALTER TABLE 语句只会锁定表一次,从而减少表的锁定时间,提高并发操作的性能。

2. 提高执行效率

每个 ALTER TABLE 操作都需要对表进行扫描和重新构建索引,这会增加执行时间。将多个操作合并为一个语句可以减少表扫描和索引重建的次数,从而提高执行效率。

3. 减少日志和备份空间

每个 ALTER TABLE 操作都会生成一条日志记录。如果有大量的 ALTER TABLE 操作,这些日志记录会占用大量的磁盘空间。合并操作可以减少日志记录的数量,节省磁盘空间。

4. 降低发生错误的概率

当你分多次执行 ALTER TABLE 语句时,任何一次操作的失败都可能导致数据不一致。将所有操作合并在一起,可以保证所有修改要么全部成功,要么全部失败,减少了数据不一致的风险。

示例对比

多次 ALTER TABLE 语句:

ALTER TABLE students ADD COLUMN email VARCHAR(255);
ALTER TABLE students MODIFY COLUMN name VARCHAR(256);
ALTER TABLE students ADD COLUMN birthdate DATE;
ALTER TABLE students DROP COLUMN old_field;

这些语句会导致表被锁定四次,每次操作都会产生相应的日志记录,并且每次操作都会重新扫描表和重建索引。

合并后的 ALTER TABLE 语句:

ALTER TABLE students
ADD COLUMN email VARCHAR(255),
MODIFY COLUMN name VARCHAR(256),
ADD COLUMN birthdate DATE,
DROP COLUMN old_field;

这个语句只会锁定表一次,减少表扫描和索引重建的次数,以及相应的日志记录。

结论

合并 ALTER TABLE 语句有助于提高性能,减少锁定时间,节省磁盘空间,并降低数据不一致的风险。

这在处理大表或高并发环境下尤其重要,有助于保持数据库的高效和稳定运行。

标签:语句,17,COLUMN,MySQL,students,mysql,TABLE,ALTER
From: https://www.cnblogs.com/houbbBlogs/p/18288712

相关文章

  • MySQL-17.其他数据日志
    C-17.其他数据日志在之前的数据库事务的章节中,已经讲过,redolog和undolog。对于线上数据库应用系统,突然遭遇数据库宕机怎么办?在这种情况下,定位宕机的原因就非常关键。我们可以查看数据库的错误日志。因为日志中记录了数据库运行中的诊断信息,包括了错误,警告和注释等信息。比如:从......
  • Java语言,MySQL数据库;基于springboot的阅读系统 86095(免费领源码)计算机毕业设计项目推
    摘 要从古至今,阅读都是人们学习新技能,新知识的一种方式。随着互联网时代的到来,传统的纸质阅读早已满足不了人们对于阅读的渴望。在这样的大背景下,电子阅读便快速崛起。越来越多的人们喜欢愿意通过这样方式来阅读书籍。基于以上种种,本文设计并实现了书籍阅读系统。目的在于......
  • Java语言,MySQL数据库;基于微信小程序的安全教育平台面向大学生 85871(免费领源码)计算机
    目 录摘要1绪论1.1研究背景1.2研究现状1.3论文结构与章节安排2 基于微信小程序的安全教育平台面向大学生系统分析2.1可行性分析2.2系统流程分析2.2.1数据增加流程2.2.2数据修改流程2.2.3数据删除流程2.3系统功能分析2.3.1功能性分析......
  • MySQL 主从报错“Got fatal error 1236 from master when reading data from binary l
    1、背景一主一从报错,测试环境从库执行showslavestatus\Gmysql>showslavestatus\G***************************1.row***************************Slave_IO_State:Master_Host:10.0.0.51Master_User:repl......
  • MySQL联合索引最左匹配原则
    MySQL中的联合索引(也叫组合索引)遵循最左匹配原则,即在创建联合索引时,查询条件必须从索引的最左边开始,否则索引不会被使用。在联合索引的情况下,数据是按照索引第一列排序,第一列数据相同时才会按照第二列排序。例如,假设有一个表t_employees,它有一个联合索引(first_name,las......
  • MySQL使用LIKE索引是否失效的验证
    1、简单的示例展示在MySQL中,LIKE查询可以通过一些方法来使得LIKE查询能够使用索引。以下是一些可以使用的方法:使用前导通配符(%),但确保它紧跟着一个固定的字符。避免使用后置通配符(%),只在查询的末尾使用。使用COLLATE来控制字符串比较的行为,使得查询能够使用索引。下......
  • mysql执行查询的过程解析
    mysql执行查询的过程客户端先发送查询语句给服务器服务器检查缓存,如果存在则返回进行sql解析,生成解析树,再预处理,生成第二个解析树,最后再经过优化器,生成真正的执行计划根据执行计划,调用存储引擎的API来执行查询将结果返回给客户端。一、客户端到服务端之间的原理客户端和服......
  • 安装MySQL(Windows10和Linux CentOS7) 很详细的
    Windows10下安装MySQL1.下载MySQL官网下载MySQL:https://www.mysql.com/进入官网点击DOWNLOADS下滑点击MySQLCommunity(GPL)Downloads点击MySQLInstallerforWindows选择版本下载这里就不需要登录注册了,直接下载2.安装MySQL找到下载的文件双击之后选择Se......
  • 8617 阶乘数字和
    这是一个关于计算阶乘结果所有位上的数字之和的问题。我们可以通过以下步骤来解决这个问题:1.首先,我们需要一个函数来计算阶乘。由于n的范围可以达到50,阶乘的结果可能非常大,所以我们需要使用一个可以处理大整数的数据类型,例如C++中的`std::vector<int>`来存储阶乘的结果。2.......
  • POJ3017 Cut the Sequence
    POJ3017CuttheSequence题目大意给定一个一个长度为\(N\)的序列\(A\),要求把该序列划分成若干段,其中每一段中的数的和不大于\(M\),现在需要使得每一段中数的最大值的和最小,求该最小值。\[0\leqn\leq10^5\\0\leqm\leq10^{11}\\0\leqa_i\leq10^6\]解题思路......