MYSQL设计表时,需要 两个TIMESTAMP 字段的情况
2018-03-30 15:23
537 查看
有时候,数据库表有这样的需求,要一个记录创建时间,一个记录修改时间。
理想中的设计是这样的,更新时间的初始值和创建时间一样:
Java代码
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;
或者是这样的,更新时间初始值为空,只有在更新的时候才有值:
Java代码
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,是执行不了的,执行时报错,估计这个很多人遇到过吧:
Java代码
Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause
网上找到个解决方法(只适用于更新时间的初始值和创建时间一样,当然这个也说得过去):
Java代码
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语句这样写:
Java代码
INSERT INTO test_table (id, create_time, update_time) VALUES (1, NULL, NULL);
或者这样写(注意,没有写create_time):
Java代码
INSERT INTO test_table (id, update_time) VALUES (1, NULL);
UPDATE语句正常写法(假设test_table.id可以修改):
Java代码
UPDATE test_table (id) VALUES (2);
补充说明:
上面的问题,应该是在5.7早期版本是这样,目前我用5.7.17版本,两个timestamp是可以的,写法是:
Java代码
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;
理想中的设计是这样的,更新时间的初始值和创建时间一样:
Java代码
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;
或者是这样的,更新时间初始值为空,只有在更新的时候才有值:
Java代码
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,是执行不了的,执行时报错,估计这个很多人遇到过吧:
Java代码
Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause
网上找到个解决方法(只适用于更新时间的初始值和创建时间一样,当然这个也说得过去):
Java代码
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语句这样写:
Java代码
INSERT INTO test_table (id, create_time, update_time) VALUES (1, NULL, NULL);
或者这样写(注意,没有写create_time):
Java代码
INSERT INTO test_table (id, update_time) VALUES (1, NULL);
UPDATE语句正常写法(假设test_table.id可以修改):
Java代码
UPDATE test_table (id) VALUES (2);
补充说明:
上面的问题,应该是在5.7早期版本是这样,目前我用5.7.17版本,两个timestamp是可以的,写法是:
Java代码
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;
相关文章推荐
- Mysql 需要两个或者多个字段都不相同
- 请教oschina缓存设计和效率问题(某些表查询后即需要更新某字段的情况如何缓存)
- 在MySql 5.0 的表里同时添加两个自动更新的timestamp字段
- 在MySql 5.0 的表里同时添加两个自动更新的timestamp字段
- mysql5.5不能同时设置两个字段为CURRENT_TIMESTAMP
- 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效
- MySql折腾小记二:text/blog类型不允许设置默认值,不允许存在两个CURRENT_TIMESTAMP
- 用coredata碰上需要根据两个字段的和进行排序
- mysql中计算两个日期的时间差函数TIMESTAMPDIFF
- MySQL中两个表字段名相同导致的一个问题
- MySQL的字段设计
- mysql-按照两个字段分组,按某个字段统计次数(字段值没有出现计算为0)
- EF Code First MySql 主从表设计的一些需要注意的内容
- mysql数据表交换两个字段的值
- mysql中合并两个字段为一个字段显示
- MYSQL 表中汉字写入或字段赋值时乱码情况排误
- 两个字段联合约束(mysql)
- MySQL里bool类型字段是否需要添加索引测试
- mysql性能优化笔记(1) 建表原则和字段设计
- Mysql怎么同步两个不同库的不同表以及部分字段