MySQL-17-mysql alter 语句怎样实现?怎样合并为一个

打印 上一主题 下一主题

主题 960|帖子 960|积分 2880

拓展阅读

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 添加一个字段?怎样修改一个字段?
实际测试
  1. mysql> select @@version;
  2. +------------+
  3. | @@version  |
  4. +------------+
  5. | 5.7.31-log |
  6. +------------+
复制代码
创建一张测试表
  1. CREATE TABLE students (
  2.     id INT AUTO_INCREMENT PRIMARY KEY,
  3.     name VARCHAR(100),
  4.     age INT
  5. );
复制代码
添加字段
  1. alter table students add column create_time datetime(6) comment '创建时间';
复制代码
测试效果
  1. mysql> alter table students add column create_time datetime(6) comment '创建时间';
  2. Query OK, 0 rows affected (0.08 sec)
  3. Records: 0  Duplicates: 0  Warnings: 0
  4. mysql>
  5. mysql> desc students;
  6. +-------------+--------------+------+-----+---------+----------------+
  7. | Field       | Type         | Null | Key | Default | Extra          |
  8. +-------------+--------------+------+-----+---------+----------------+
  9. | id          | int(11)      | NO   | PRI | NULL    | auto_increment |
  10. | name        | varchar(100) | YES  |     | NULL    |                |
  11. | age         | int(11)      | YES  |     | NULL    |                |
  12. | create_time | datetime(6)  | YES  |     | NULL    |                |
  13. +-------------+--------------+------+-----+---------+----------------+
  14. 4 rows in set (0.00 sec)
复制代码
修改字段
  1. ALTER TABLE students MODIFY COLUMN name VARCHAR(256);
复制代码
实际测试效果:
  1. mysql> ALTER TABLE students MODIFY COLUMN name VARCHAR(256);
  2. Query OK, 0 rows affected (0.02 sec)
  3. Records: 0  Duplicates: 0  Warnings: 0
  4. mysql> desc students;
  5. +-------------+--------------+------+-----+---------+----------------+
  6. | Field       | Type         | Null | Key | Default | Extra          |
  7. +-------------+--------------+------+-----+---------+----------------+
  8. | id          | int(11)      | NO   | PRI | NULL    | auto_increment |
  9. | name        | varchar(256) | YES  |     | NULL    |                |
  10. | age         | int(11)      | YES  |     | NULL    |                |
  11. | create_time | datetime(6)  | YES  |     | NULL    |                |
  12. +-------------+--------------+------+-----+---------+----------------+
  13. 4 rows in set (0.00 sec)
复制代码
修改字段名称+属性

如果我们盼望修改字段名称,需要利用 CHANGE COLUMN
  1. ALTER TABLE students CHANGE COLUMN create_time created_time datetime(3) COMMENT '创建时间';
复制代码
实际测试效果如下:
  1. mysql> ALTER TABLE students CHANGE COLUMN create_time created_time datetime(3) COMMENT '创建时间';
  2. Query OK, 0 rows affected (0.09 sec)
  3. Records: 0  Duplicates: 0  Warnings: 0
  4. mysql> desc students;
  5. +--------------+--------------+------+-----+---------+----------------+
  6. | Field        | Type         | Null | Key | Default | Extra          |
  7. +--------------+--------------+------+-----+---------+----------------+
  8. | id           | int(11)      | NO   | PRI | NULL    | auto_increment |
  9. | name         | varchar(256) | YES  |     | NULL    |                |
  10. | age          | int(11)      | YES  |     | NULL    |                |
  11. | created_time | datetime(3)  | YES  |     | NULL    |                |
  12. +--------------+--------------+------+-----+---------+----------------+
  13. 4 rows in set (0.00 sec)
复制代码
场景2:怎样把同一个表的多个 alter 语句合并为 1 个?

在 MySQL 中,你可以将多个 ALTER TABLE 语句合并为一个,以进步服从和淘汰表锁定时间。这是通过在一个 ALTER TABLE 语句中指定多个修改来实现的。每个修改用逗号分隔。
假设你有以下多个 ALTER TABLE 语句:
  1. ALTER TABLE my_table ADD COLUMN new_column1 VARCHAR(100);
  2. ALTER TABLE my_table MODIFY COLUMN existing_column VARCHAR(256);
  3. ALTER TABLE my_table ADD COLUMN new_column2 INT;
  4. ALTER TABLE my_table DROP COLUMN old_column;
复制代码
你可以将它们合并为一个 ALTER TABLE 语句,如下所示:
  1. ALTER TABLE my_table
  2. ADD COLUMN new_column1 VARCHAR(100),
  3. MODIFY COLUMN existing_column VARCHAR(256),
  4. ADD COLUMN new_column2 INT,
  5. DROP COLUMN old_column;
复制代码
示例

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

  • 添加一个名为 email 的字段,类型为 VARCHAR(255)。
  • 修改 name 字段的长度为 VARCHAR(256)。
  • 添加一个名为 birthdate 的字段,类型为 DATE。
  • 删除一个名为 old_field 的字段。
将这些操作合并为一个 ALTER TABLE 语句:
  1. ALTER TABLE students
  2. ADD COLUMN email VARCHAR(255),
  3. MODIFY COLUMN name VARCHAR(256),
  4. ADD COLUMN birthdate DATE,
  5. DROP COLUMN old_field;
复制代码
注意事项


  • 顺序题目:在某些情况下,操作的顺序大概很重要。比方,如果你要修改一个字段的名称然后更改其类型,确保先重命名再修改类型。
  • 兼容性题目:确保所有操作在一个 ALTER TABLE 语句中实行时不会相互冲突。比方,删除一个字段然后再添加同名字段在同一个语句中大概会出题目。
  • 备份数据:在对表结构进行庞大更改之前,最好备份数据,以防出现意外情况。
合并 ALTER TABLE 语句不仅可以进步实行服从,还可以淘汰数据库表的锁定时间,尤其是在处理大表时,这一点尤为重要。
为什么需要合并为一个?

将多个 ALTER TABLE 语句合并为一个有以下几个重要缘故原由和洽处:
1. 淘汰表锁定时间

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

每个 ALTER TABLE 操作都需要对表进行扫描和重新构建索引,这会增加实行时间。将多个操作合并为一个语句可以淘汰表扫描和索引重建的次数,从而进步实行服从。
3. 淘汰日志和备份空间

每个 ALTER TABLE 操作都会生成一条日志记载。如果有大量的 ALTER TABLE 操作,这些日志记载会占用大量的磁盘空间。合并操作可以淘汰日志记载的数量,节省磁盘空间。
4. 降低发生错误的概率

当你分多次实行 ALTER TABLE 语句时,任何一次操作的失败都大概导致数据不一致。将所有操作合并在一起,可以保证所有修改要么全部成功,要么全部失败,淘汰了数据不一致的风险。
示例对比

多次 ALTER TABLE 语句:
  1. ALTER TABLE students ADD COLUMN email VARCHAR(255);
  2. ALTER TABLE students MODIFY COLUMN name VARCHAR(256);
  3. ALTER TABLE students ADD COLUMN birthdate DATE;
  4. ALTER TABLE students DROP COLUMN old_field;
复制代码
这些语句会导致表被锁定四次,每次操作都会产生相应的日志记载,而且每次操作都会重新扫描表和重建索引。
合并后的 ALTER TABLE 语句:
  1. ALTER TABLE students
  2. ADD COLUMN email VARCHAR(255),
  3. MODIFY COLUMN name VARCHAR(256),
  4. ADD COLUMN birthdate DATE,
  5. DROP COLUMN old_field;
复制代码
这个语句只会锁定表一次,淘汰表扫描和索引重建的次数,以及相应的日志记载。
结论

合并 ALTER TABLE 语句有助于进步性能,淘汰锁定时间,节省磁盘空间,并降低数据不一致的风险。
这在处理大表或高并发环境下尤其重要,有助于保持数据库的高效和稳定运行。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

勿忘初心做自己

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表