Mysql修改字段为默认空

Mysql修改字段为默认空

数据库字段定义尽量不要为默认空,但是为了满足产品需求和减少开发量,所以直接将字段改为默认空。但是一样的修改SQL修改同一张表的两个Not Null字段其中一个1秒内完成;另外一个执行了1分钟都没有执行完。鉴于执行时间太慢和最近升级了数据库版本为8.0,所以中止执行,创建测试表验证SQL是否有问题。

DML

ALTER TABLE test_table_define MODIFY COLUMN type_name tinyint(1) DEFAULT NULL COMMENT 'Not Null Alter Null Test';

test_table_define:表名;type_name:字段名。

表创建结构

CREATE TABLE test_table_define (
  id int(11) NOT NULL AUTO_INCREMENT,
  type_name tinyint(4) DEFAULT 1 COMMENT 'Not Null Alter Null Test',
  remark_ varchar(255) DEFAULT NULL,
  PRIMARY KEY (id)
)
ENGINE = INNODB,
CHARACTER SET utf8,
COLLATE utf8_general_ci,
COMMENT = '测试表定义问题';

新增两条数据

INSERT INTO test_table_define (remark_) VALUES
('测试字段默认非空,用SQL改为默认空!'),
('测试字段默认非空,用SQL改为默认空!');

Mysql修改字段为默认空

执行

  1. Mysql版本5.7.18执行:正常,SQL.sql: DML succeeded [0.015s]
  2. Mysql版本8.0.23执行:正常,SQL.sql: DML succeeded [0.459s]

修改后表结构

CREATE TABLE test_table_define (
  id int NOT NULL AUTO_INCREMENT,
  type_name tinyint DEFAULT NULL COMMENT 'Not Null Alter Null Test',
  remark_ varchar(255) DEFAULT NULL,
  PRIMARY KEY (id)
)
ENGINE = INNODB,
CHARACTER SET utf8,
COLLATE utf8_general_ci,
COMMENT = '测试表定义问题';

结论

所以,DML脚本是正确,版本升级之后没有其他帖子说的增加了限制不允许Not Null改为Null。
找了一张表数据333105修改两个字段默认空,执行相同的DML脚本结果分别是:SQL.sql: DML succeeded [0.459s],SQL.sql: DML succeeded [51.836s]。所以是数据量影响了DML执行时间。

后续

MODIFY COLUMN底层做了什么事情,那么慢?
同一张表数据量都是333105,都是MODIFY,为什么一个字段只需0.4S,另一个却需要51.836S?

上一篇:第22节--DML语言之删除语句


下一篇:八、mysql DML语言