timestamps()没生效是因为它仅等价于创建created_at和updated_at字段,不自动添加DEFAULT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP;需手动用useCurrent()和useCurrentOnUpdate()显式声明,且依赖MySQL 5.6.5+及严格模式配置。

迁移里加 timestamps() 为什么没生效
因为 timestamps() 只是快捷方法,它默认生成 created_at 和 updated_at 两个字段,但不会自动设默认值或触发更新——Laravel 的自动填充靠的是模型层的 $timestamps 和 protected $dates 配合,不是靠数据库默认值。如果你在 MySQL 里查表结构,会发现这两个字段只是 DATETIME NULL,没 DEFAULT CURRENT_TIMESTAMP。
实操建议:
- 如果想让数据库层面强制默认(比如绕过 Laravel、直接用 SQL 插入),得手动写
useCurrent()或useCurrentOnUpdate() -
timestamps()等价于timestamp('created_at')->useCurrent(), timestamp('updated_at')->useCurrentOnUpdate(),但仅限 Laravel 8+;低版本不支持useCurrentOnUpdate() - MySQL 5.6.5+ 才支持
TIMESTAMP/DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,老版本只能用TIMESTAMP类型 + 默认值,DATETIME不行
created_at 设默认当前时间但 updated_at 不自动更新
常见错误是只写了 useCurrent(),忘了给 updated_at 加 useCurrentOnUpdate()。更隐蔽的问题是:MySQL 严格模式下,如果表里已有 created_at 用了 useCurrent(),但 updated_at 没显式声明 useCurrentOnUpdate(),它就真不会自动更新。
实操建议:
- 迁移里必须分开写:
$table->timestamp('created_at')->useCurrent(); $table->timestamp('updated_at')->useCurrentOnUpdate(); - 别依赖
timestamps()的“智能推断”——它在 Laravel 9+ 才默认带上useCurrentOnUpdate(),旧项目几乎都不带 - 执行迁移后,用
SHOW CREATE TABLE users;确认生成的 SQL 里有ON UPDATE CURRENT_TIMESTAMP,没有就是没生效
模型里关掉自动时间戳,但数据库仍想保留默认值
有些场景(比如日志表、导入数据)不想让 Laravel 自动写 created_at,但又希望 DB 层兜底——这时不能删字段,也不能关 $timestamps = false 后还指望迁移里的 useCurrent() 起作用。因为 Laravel 迁移只是建表,不控制后续插入逻辑。
实操建议:
- 模型里设
public $timestamps = false;,迁移里仍保留timestamp('created_at')->useCurrent()字段定义 - 插入数据时,要么显式传
['created_at' => now()],要么靠数据库默认值兜底(前提是字段类型和默认值定义正确) - 注意:如果字段是
DATETIME类型且 MySQL 版本 useCurrent() 会静默降级为NULL,实际没默认值——换TIMESTAMP或升级 MySQL
MySQL 报错 Invalid default value for 'created_at'
这是 MySQL 严格模式(STRICT_TRANS_TABLES)在作怪。当你用 useCurrent() 但字段类型是 DATETIME 且 MySQL 版本太低,或者表引擎不是 InnoDB,它就会拒绝建表。
实操建议:
- 先查 MySQL 模式:
SELECT @@sql_mode;,确认含STRICT_TRANS_TABLES - 临时关闭(不推荐生产):
SET sql_mode = '';;长期解法是改字段类型为TIMESTAMP,或升级 MySQL 到 5.6.5+ - Laravel 迁移里显式指定类型:
$table->timestamp('created_at')->useCurrent()->nullable(false);,避免因隐式NULL触发校验失败


















