有时候,数据库表有这样的需求,要一个记录创建时间,一个记录修改时间。?
理想中的设计是这样的,更新时间的初始值和创建时间一样:?
- CREATE?TABLE?`test_table`?(??
- `id`?INT(?10?)?NOT?NULL,??
- `create_time`?TIMESTAMP?NOT?NULL?DEFAULT?CURRENT_TIMESTAMP,??
- `update_time`?TIMESTAMP?NOT?NULL?DEFAULT?CURRENT_TIMESTAMP?ON?UPDATE?CURRENT_TIMESTAMP??
- )?ENGINE?=?INNODB;??
或者是这样的,更新时间初始值为空,只有在更新的时候才有值:?
- CREATE?TABLE?`test_table`?(??
- `id`?INT(?10?)?NOT?NULL,??
- `create_time`?TIMESTAMP?NOT?NULL?DEFAULT?CURRENT_TIMESTAMP,??
- `update_time`?TIMESTAMP?ON?UPDATE?CURRENT_TIMESTAMP??
- )?ENGINE?=?INNODB;??
这样的建表SQL,是执行不了的,执行时报错,估计这个很多人遇到过吧:?
- Incorrect?table?definition;?there?can?be?only?one?TIMESTAMP?column?with?CURRENT_TIMESTAMP?in?DEFAULT?or?ON?UPDATE?clause??
网上找到个解决方法(只适用于更新时间的初始值和创建时间一样,当然这个也说得过去):?
- CREATE?TABLE?`test_table`?(??
- `id`?INT(?10?)?NOT?NULL,??
- `create_time`?TIMESTAMP?NOT?NULL?DEFAULT?0,??
- `update_time`?TIMESTAMP?NOT?NULL?DEFAULT?CURRENT_TIMESTAMP?ON?UPDATE?CURRENT_TIMESTAMP??
- )?ENGINE?=?INNODB;??
INSERT语句这样写:?
- INSERT?INTO?test_table?(id,?create_time,?update_time)?VALUES?(1,?NULL,?NULL);??
或者这样写(注意,没有写create_time):?
- INSERT?INTO?test_table?(id,?update_time)?VALUES?(1,?NULL);??
UPDATE语句正常写法(假设test_table.id可以修改):?
- UPDATE?test_table?(id)?VALUES?(2);??