您的位置:首页 > 数据库 > MySQL

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;  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: