方法一:修改 SQL Mode

修改 MySQL 的 SQL Mode,使其允许使用非严格模式。这样可以避免严格模式对默认值的限制。

  1. 查看当前 SQL Mode:

    1
    SELECT @@sql_mode;
  2. 去掉 STRICT_TRANS_TABLES 或者 STRICT_ALL_TABLES 模式(这些模式是导致错误的原因之一):

    1
    SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
  3. 为确保永久生效,可以在 MySQL 配置文件(通常是 my.cnfmy.ini)中修改 sql_mode

    1
    2
    [mysqld]
    sql_mode = "NO_ENGINE_SUBSTITUTION"

方法二:修改表结构

在迁移过程中,修改表结构以使默认值与 SQL Mode 兼容。

  1. 确认表字段定义的默认值与 SQL Mode 兼容。例如,避免使用不正确的时间戳格式:

    1
    ALTER TABLE your_table MODIFY your_column TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
  2. 如果表字段是 NOT NULL 且没有默认值,可以将其改为允许 NULL 或者为其设置合理的默认值:

    1
    ALTER TABLE your_table MODIFY your_column INT DEFAULT 0;

方法三:禁用严格模式仅用于迁移

在迁移过程中临时禁用严格模式,迁移完成后再恢复严格模式。

  1. 禁用严格模式:

    1
    SET SESSION sql_mode = '';
  2. 执行迁移操作。

  3. 迁移完成后,恢复严格模式:

    1
    SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';

示例

假设你在迁移一个包含时间戳字段的表时遇到该错误:

1
2
3
4
CREATE TABLE example_table (
id INT NOT NULL,
created_at TIMESTAMP DEFAULT '0000-00-00 00:00:00'
);

解决方法如下:

  1. 修改 SQL Mode(临时或永久):

    1
    SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
  2. 或者修改表结构以使用当前时间作为默认值:

    1
    ALTER TABLE example_table MODIFY created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP;