手摸手系列之批量修改MySQL数据库所有表中某些字段的类型/注释/默认值

说实话,我在编辑MySQL数组字段的时候差点就遇到麻烦了。
你说的步骤看起来很清楚,但实际操作时还是要小心。

例如,在检查字段的第一步中,不要只使用 SELECT TABLE_NAME, COLUMN_NAME FROM INFORMATION_SCHEMA。
COLUMNS WHERE COLUMN_NAME = 'TENANT_ID' AND DATA_TYPE = 'decimal';这种类型的。
上次换系统的时候,发现有的表中的TENANT_ID居然是DECIMAL(3 8 ,0),有的却是DECIMAL(1 0,2 )。
如果直接改变类型很容易出现问题。
我添加了一个过滤条件AND CHAR_LENGTH(COLUMN_TYPE) = 7 AND COLUMN_TYPE AS 'decimal%',这样可以更准确地找到目标字段。

构建SQL数组修饰符时,要注意数据类型转换兼容性。
以十进制到 h3int 转换为例。
如果TENANT_ID在表中存储的是9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 .9 9 这样的值,直接转换为h3int肯定会导致溢出。
当我处理这种情况时,我首先在测试库中运行 SELECT CASE WHEN value > BIGINT_MAX THEN NULL ELSE value END AS new_value FROM your_table ;验证数据并确保转换的安全性。
还有注释部分,只需使用 ALTER TABLE your_table MODIFY COLUMN your_column your_type COMMENT 'new_comment';即可,但是请注意,一些旧版本的 MySQL 对注释长度有限制。
在进行更改之前,最好检查 sql_mode 系统变量中是否存在可能影响更改的设置,例如 NO_ZERO_IN_DATE 和 NO_ZERO_DATE。

最让我头疼的是修改默认值。
例如,您想将 DEL_FLAG 的默认值更改为 0,但该字段可能已经有大量 NULL 值。
此时,直接使用 ALTER TABLE your_table MODIFY COLUMN del_flag int DEFAULT 0;会把所有的NULL都变成0,这显然不是预期的效果。
我当时分两步完成:首先使用 UPDATE your_table SET del_flag = 0 WHERE del_flag IS NULL;清除旧值,然后更改默认值。
当然,如果表数据量特别大,最好是ANALYZE TABLE your_table;在此操作之前避免表长时间阻塞。

验证过程不要缓慢。
只使用 DESCRIBE 检查类型是可以的,但最好使用 SHOW FULL COLUMNS FROM your_table;检查注释和默认值。
上次遇到了ALTER语句执行成功,但是注释没有生效的情况。
最后我发现我忘了添加RESTRICT参数。
不过,MySQL 版本检查对于这类问题现在已经越来越好了。
更改后,可以直接使用CHECK TABLE your_table;您也可以快速找到问题。

最实用的建议是创建表的临时备份。
像这样: sql CREATE TABLE your_table_backup AS SELECT FROM your_table;
如果修改主表后出现问题,直接RENAME TABLE your_table TO your_table_old, your_table_backup TO your_table;可以回滚。
这种方法比简单地复制数据库要快得多。
当然,如果表结构特别复杂,比如外键关系,那么简单使用 mysqldump。

如何在MySQL中修改表字段

ALTER TABLE 行用于更改字段。

同时更改姓名和性别。

MODIFY 仅更改类型和约束。

ADD 添加一个新字段。

GUI更方便。

图形工作。

phpMyAdmin 网页操作。

备份您的第一个信息。

休息期间主表会发生变化。

对于更改类型,应用程序需要同步。