Laravel数据库迁移中,如何使用DB::raw设置字段默认当前时间值?
- 内容介绍
- 文章标签
- 相关推荐
本文共计758个文字,预计阅读时间需要4分钟。
MySQL 5.6.5 或 PostgreSQL 才能使用 DB::raw() 给字段设置默认时间表达式,Laravel 迁移里直接写 + useCurrent() 或 useCurrentOnUpdate() 更安全、更易移植。
MySQL 中用 DB::raw('CURRENT_TIMESTAMP') 设默认值会失败
很多人在迁移里这么写:
Schema::table('posts', function (Blueprint $table) { $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'))->change(); });
这会在 MySQL 5.6.5 以下或严格模式下报错:SQLSTATE[HY000]: General error: 1067 Invalid default value for 'created_at'。原因:MySQL 要求 TIMESTAMP / DATETIME 的默认表达式必须是常量(如 CURRENT_TIMESTAMP),但 Laravel 的 DB::raw() 在 default() 中不会被识别为“字面量”,而是当成字符串值插入,最终生成类似 DEFAULT 'CURRENT_TIMESTAMP' 的 SQL —— 带引号就失效了。
本文共计758个文字,预计阅读时间需要4分钟。
MySQL 5.6.5 或 PostgreSQL 才能使用 DB::raw() 给字段设置默认时间表达式,Laravel 迁移里直接写 + useCurrent() 或 useCurrentOnUpdate() 更安全、更易移植。
MySQL 中用 DB::raw('CURRENT_TIMESTAMP') 设默认值会失败
很多人在迁移里这么写:
Schema::table('posts', function (Blueprint $table) { $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'))->change(); });
这会在 MySQL 5.6.5 以下或严格模式下报错:SQLSTATE[HY000]: General error: 1067 Invalid default value for 'created_at'。原因:MySQL 要求 TIMESTAMP / DATETIME 的默认表达式必须是常量(如 CURRENT_TIMESTAMP),但 Laravel 的 DB::raw() 在 default() 中不会被识别为“字面量”,而是当成字符串值插入,最终生成类似 DEFAULT 'CURRENT_TIMESTAMP' 的 SQL —— 带引号就失效了。

