如何正确实现数据表插入时间和更新时间的设计?
在使用eloquent时,通过官方文档看到可以自定义插入字段和更新字段名,附链接https://laravel-china.org/doc...
接下来先给出数据表的设计:
CREATE TABLE `plans`(
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`title` varchar(100) NOT NULL,
`content` mediumtext,
`status` tinyint(1) NOT NULL DEFAULT 0,
`create_time` TIMESTAMP,
`update_time` TIMESTAMP,
PRIMARY KEY(id),
FOREIGN KEY(user_id) REFERENCES users(id)
)ENGINE=INNODB;
因为我使用的是mysql5.6版本,所以支持设置两个timestamp类型,但是这样设置后,创建时两个时间相同我理解,但是在我更新数据后,两个字段还是相同的更新后的时间,我特别不能理解,然后我试了一段时间,弃用了这种方式,于是我使用了原生语句,在更新时,同时更新update_time为当前时间,但是发现create_time同样也是进行了更新,还是两个时间段能相同,我想问在不改变数据表字段类型的前提下有没有好的方法,因为我做的小项目都快完了,才发现这个问题,想找到一个好的解决办法
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
你现在的逻辑,每次操作,都会同时对create_time和update_time两个字段操作。这两个字段需要定义成选填,然后数据从客户端传过来,不应该从数据库层面计算。理论上在数据库计算问题不大,但是实际需求中,如果用户时间点卡得比较准,那用户保存的时间是9:59:59,但是数据库触发保存可能就是10点了,这时候数据就是错的了。所以你所有的数据都应该从客户端取得,无论是create_time还是update_time,都是用户点保存按钮的那一时刻,不应该是数据在数据库触发保存动作的时间。如果考虑网络等其他因素,你的数据偏差可能更大。
因为在建表时create_time timestamp,默认是timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,可以通过show create table plans确认一下。这种情况,这一行数据被更新的话,create_time这个字段就会自动更新为now()了。
解决方法可以是在建表的时候显示指定create_time timestamp default current_timestamp,这样就不会被默认加上ON UPDATE CURRENT_TIMESTAMP了,也就是create_time字段不会默认在更新的时候一起自动更新了。
你可以尝试创建单独的model
并禁止时间自动更新,并手动更新时间字段
create_time
的CURRENT_TIMESTAMPS
去掉,update_time
加上,创建数据的时候手动赋值创建时间