Shuo
Shuo I'm a DBA(Database Administrator), we can share and discuss MySQL, MongoDB, Redis and other databases here, also including learning Python, Shell, Golang together.

Tips: MySQL8.0版本DEFAULT_GENERATED的问题


Tips: MySQL8.0版本DEFAULT_GENERATED的问题

背景

最近使用mysqldiff工具进行多源数据表结构对比时(一个数据源为8.0版本,另一个为5.7版本),发现mysqldiff得到的结果中,出现了如下语句:

1
2
3
ALTER TABLE  tb1
CHANGE COLUMN create_time create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP DEFAULT_GENERATED COMMENT '创建时间';

把mysqldiff生成的sql文件在5.7版本中回放mysqldiff的结果时候,报错:
**ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘DEFAULT_GENERATED COMMENT ‘创建时间’, **

所以推测为8.0新增的表结构说明,而5.7版本不兼容

解决

8.0文档对于DEFAULT_GENERATED的说明:
DEFAULT_GENERATED for columns that have an expression default value.
即,在column上若有表达式类型的默认值时,会在该行的Extra列打上DEFAULT_GENERATED的tag

The latest version of mysql is now adding a DEFAULT_GENERATED tag when a default is explicitly set

https://dev.mysql.com/doc/refman/8.0/en/show-columns.html

登录到数据库中,查看该表的columns信息:

其对于数据无影响,但是在使用mysqldiff工具时候,会把Extra列同样作为一个指标,出现不一致的情况。

解决

可以编辑mysqldiff的结果,删除DEFAULT_GENERATED关键字即可。

附加:
mysqldiff检查项说明:

https://www.percona.com/blog/2015/04/15/checking-table-definition-consistency-mysqldiff/

comments powered by Disqus