Timestamp字段未自动更新是因为建表时未设置DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;MySQL 5.6.5+才默认支持该语法,低版本会忽略,且一个表最多只能有一个TIMESTAMP字段使用CURRENT_TIMESTAMP作默认值。
常见原因是建表时只设了 timestamp 类型,但没加 default current_timestamp on update current_timestamp。mysql 5.6.5+ 才默认支持 on update current_timestamp,低版本即使写了也会被忽略——phpmyadmin 界面里勾选“自动更新”却无效,大概率是这个原因。
另外,一个表最多只能有一个 TIMESTAMP 字段带 CURRENT_TIMESTAMP 作为默认值(除非显式指定 NULL 或 DEFAULT '0000-00-00 00:00:00'),否则会报错 Invalid default value for 'xxx'。
进入表结构页 → 找到目标 TIMESTAMP 字段 → 点击“更改”图标 → 在“属性”下拉框中选 TIMESTAMP(确保类型没错)→ 在“默认”栏填:CURRENT_TIMESTAMP → 勾选“自动更新”复选框 → 点击“保存”。
NULL 或有非 CURRENT_TIMESTAMP 默认值,需先清空“默认”值再勾选DEFAULT CURRENT_TIMESTAMP 和勾选“自动更新”DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 的 ALTER TABLE 语句界面操作有时不生效,尤其对已有数据的表。直接执行 SQL 更可控:
ALTER TABLE `your_table` MODIFY `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
注意替换 your_table 和 updated_at 为实际名;如果字段已存在且有数据,MODIFY 比 CHANGE 更安全(不重命名)。
立即学习“PHP免费学习笔记(深入)”;
Incorrect table definition,可能是已有其他 TIMESTAMP 字段占用了默认值资格,需先移除另一个字段的 DEFAULT CURRENT_TIMESTAMP
TIMESTAMP 自动更新,但 phpMyAdmin 界面仍只允许一个“自动更新”勾选,此时必须用 SQLON UPDATE CURRENT_TIMESTAMP 对 INSERT 无影响,只作用于 UPDATE 语句如果字段允许 NULL,MySQL 可能不会触发自动更新;如果开启了 STRICT_TRANS_TABLES,插入 NULL 到非空 TIMESTAMP 字段会报错,导致自动更新逻辑被跳过。
NULL(除非你明确需要它可为空):应为 `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
'0000-00-00 00:00:00' 作默认值——这在严格模式下非法,且会禁用自动更新UPDATE your_table SET name='test' WHERE id=1; 后查 updated_at 是否变化,比看 phpMyAdmin 界面更准TIMESTAMP 自动行为的限制很具体——尤其是多个时间字段共存、版本差异、严格模式开关这些点,光靠界面勾选往往掩盖了真正的问题。