mysql数据库迁移Invalid default value for的解决办法
方法一:修改 SQL Mode
修改 MySQL 的 SQL Mode,使其允许使用非严格模式。这样可以避免严格模式对默认值的限制。
查看当前 SQL Mode:
1
SELECT @@sql_mode;
去掉
STRICT_TRANS_TABLES
或者STRICT_ALL_TABLES
模式(这些模式是导致错误的原因之一):1
SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
为确保永久生效,可以在 MySQL 配置文件(通常是
my.cnf
或my.ini
)中修改sql_mode
:1
2[mysqld]
sql_mode = "NO_ENGINE_SUBSTITUTION"
方法二:修改表结构
在迁移过程中,修改表结构以使默认值与 SQL Mode 兼容。
确认表字段定义的默认值与 SQL Mode 兼容。例如,避免使用不正确的时间戳格式:
1
ALTER TABLE your_table MODIFY your_column TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
如果表字段是
NOT NULL
且没有默认值,可以将其改为允许NULL
或者为其设置合理的默认值:1
ALTER TABLE your_table MODIFY your_column INT DEFAULT 0;
方法三:禁用严格模式仅用于迁移
在迁移过程中临时禁用严格模式,迁移完成后再恢复严格模式。
禁用严格模式:
1
SET SESSION sql_mode = '';
执行迁移操作。
迁移完成后,恢复严格模式:
1
SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
示例
假设你在迁移一个包含时间戳字段的表时遇到该错误:
1 | CREATE TABLE example_table ( |
解决方法如下:
修改 SQL Mode(临时或永久):
1
SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
或者修改表结构以使用当前时间作为默认值:
1
ALTER TABLE example_table MODIFY created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP;