推荐在 yii 2.0.36 迁移中为时间戳字段使用 timestamp() 配合 defaultvalue(0) 和 append() 实现 mysql 自动填充,但多数据库场景应改用 integer() + timestampbehavior 统一处理,并添加索引提升性能。

在 Yii 2.0.36 中使用 migration 创建时间戳字段(如 created_at、updated_at),推荐使用 timestamp() 配合 defaultValue() 和 append(),并注意数据库层面的默认行为(尤其是 MySQL 的 CURRENT_TIMESTAMP)。
基础写法:手动设置默认值和自动更新
适用于 MySQL,确保字段支持自动初始化与更新:
- 用
$this->timestamp()声明字段类型(对应 MySQL 的TIMESTAMP或DATETIME) -
defaultValue(0)避免 NULL,默认由应用层或 DB 层控制初始值 -
append('DEFAULT CURRENT_TIMESTAMP')让 MySQL 自动填充创建时间 -
append('ON UPDATE CURRENT_TIMESTAMP')实现更新时自动刷新(仅对updated_at)
示例代码:
$this->createTable('{{%post}}', [
'id' => $this->primaryKey(),
'title' => $this->string()->notNull(),
'created_at' => $this->timestamp()->defaultValue(0)->append('DEFAULT CURRENT_TIMESTAMP'),
'updated_at' => $this->timestamp()->defaultValue(0)->append('ON UPDATE CURRENT_TIMESTAMP'),
]);
兼容多数据库的稳妥方案(推荐)
若需兼容 PostgreSQL、SQLite 等不支持 ON UPDATE 的数据库,应放弃 DB 层自动更新,改由 Yii 行为(TimestampBehavior)统一处理:
- 字段定义为
$this->integer()(存 Unix 时间戳)或$this->dateTime()(存格式化时间) - 默认值设为
$this->null()或$this->integer()->defaultValue(null) - 在 Model 中配置
TimestampBehavior,由 PHP 控制赋值逻辑
迁移中写法示例(通用):
$this->createTable('{{%post}}', [
'id' => $this->primaryKey(),
'title' => $this->string()->notNull(),
'created_at' => $this->integer()->notNull()->defaultValue(0),
'updated_at' => $this->integer()->notNull()->defaultValue(0),
]);
注意 MySQL 的 TIMESTAMP 限制
MySQL 中一个表最多只能有一个字段使用 CURRENT_TIMESTAMP 作为默认值并启用 ON UPDATE;若已有 created_at 占用该能力,updated_at 就不能同时用 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP —— 此时建议统一用整型时间戳 + TimestampBehavior,更可控。
后续补充索引(可选但推荐)
为提升查询性能,可在迁移末尾添加索引:
$this->createIndex('{{%idx-post-created_at}}', '{{%post}}', 'created_at');
$this->createIndex('{{%idx-post-updated_at}}', '{{%post}}', 'updated_at');











