当前位置: 首页 > news >正文

mysql如何设置两个默认时间列

timestamp设置默认值是Default CURRENT_TIMESTAMP

timestamp设置随着表变化而自动更新是ON UPDATE CURRENT_TIMESTAMP

 

但是由于

一个表中至多只能有一个字段设置CURRENT_TIMESTAMP

两行设置DEFAULT CURRENT_TIMESTAMP是不行的。

 

还有一点要注意

1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE `device` (
     `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
     `toid` INT(10) UNSIGNED NOT NULL DEFAULT '0'  COMMENT 'toid' ,
     `createtime` TIMESTAMP NOT NULL COMMENT '创建时间' ,
     `updatetime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后更新时间' ,
     PRIMARY KEY (`id`),
     UNIQUE INDEX `toid` (`toid`)
)
COMMENT= '设备表'
COLLATE= 'utf8_general_ci'
ENGINE=InnoDB;

像这个设置也是不行的。

原因是mysql会默认为表中的第一个timestamp字段(且设置了NOT NULL)隐式设置DEFAULAT CURRENT_TIMESTAMP。所以说上例那样的设置实际上等同于设置了两个CURRENT_TIMESTAMP。

 

分析需求

一个表中,有两个字段,createtime和updatetime。

1 当insert的时候,sql两个字段都不设置,会设置为当前的时间

2 当update的时候,sql中两个字段都不设置,updatetime会变更为当前的时间

 

这样的需求是做不到的。因为你无法避免在两个字段上设置CURRENT_TIMESTAMP

 

解决办法有几个:

1 使用触发器。

当insert和update的时候触发器触发时间设置。

网上有人使用这种方法。当然不怀疑这个方法的可用性。但是对于实际的场景来说,无疑是为了解决小问题,增加了复杂性。

 

2 将第一个timestamp的default设置为0

表结构如下:

1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE `device` (
     `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
     `toid` INT(10) UNSIGNED NOT NULL DEFAULT '0'  COMMENT 'toid' ,
     `createtime` TIMESTAMP NOT NULL DEFAULT 0 COMMENT '创建时间' ,
     `updatetime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间' ,
     PRIMARY KEY (`id`),
     UNIQUE INDEX `toid` (`toid`)
)
COMMENT= '设备表'
COLLATE= 'utf8_general_ci'
ENGINE=InnoDB;

这样的话,你需要的插入和更新操作变为:

insert into device set toid=11,createtime=null;

update device set toid=22 where id=1;

 

这里注意的是插入操作的createtime必须设置为null!!

虽然我也觉得这种方法很不爽,但是这样只需要稍微修改insert操作就能为sql语句减负,感觉上还是值得的。这也确实是修改数据库最小又能保证需求的方法了。当然这个方法也能和1方法同时使用,就能起到减少触发器编写数量的效果了。

3 老老实实在sql语句中使用时间戳。

这个是最多人也是最常选择的

表结构上不做过多的设计:

1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE `device` (
     `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
     `toid` INT(10) UNSIGNED NOT NULL DEFAULT '0'  COMMENT 'toid' ,
     `createtime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' ,
     `updatetime` TIMESTAMP NOT NULL COMMENT '最后更新时间' ,
     PRIMARY KEY (`id`),
     UNIQUE INDEX `toid` (`toid`)
)
COMMENT= '设备表'
COLLATE= 'utf8_general_ci'
ENGINE=InnoDB;

这样你就需要在插入和update的操作的时候写入具体的时间戳。

insert device set toid=11,createtime=’2012-11-2 10:10:10’,updatetime=’2012-11-2 10:10:10’

update device set toid=22,updatetime=’2012-11-2 10:10:10’ where id=1

其实反观想想,这样做的好处也有一个:current_timestamp是mysql特有的,当数据库从mysql转移到其他数据库的时候,业务逻辑代码是不用修改的。

 

ps:这三种方法的取舍就完全看你自己的考虑了。顺便说一下,最后,我还是选择第三种方法。

 

摘自:https://www.cnblogs.com/yjf512/archive/2012/11/02/2751058.html

转载于:https://www.cnblogs.com/RCJL/p/8682827.html

相关文章:

  • Linux运维命令总结
  • 统计学习方法概论---泛化能力
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • 航迹带您了解消防大队,培养消防意识,消除消防隐患
  • JavaScript的数据结构与算法(五) —— 集合
  • SQLServer之数据库行锁
  • 怎样将手机中的录音转换成文字
  • Java_第一次作业一稿修改建议
  • Lua rawget rawset newindex 函数定义和例子
  • Python学习手册之正则表达式和元字符
  • 如何用纯 CSS 创作一个变色旋转动画
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 使用 Fastlane 实现 iOS 跟 Android 自动打包脚本
  • Python练习-迭代-2018.11.28
  • 武汉区块链软件技术公司:艺术市场如何从区块链中受益?
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 2019年如何成为全栈工程师?
  • Angular Elements 及其运作原理
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • Java深入 - 深入理解Java集合
  • Magento 1.x 中文订单打印乱码
  • markdown编辑器简评
  • Median of Two Sorted Arrays
  • mysql 数据库四种事务隔离级别
  • opencv python Meanshift 和 Camshift
  • react 代码优化(一) ——事件处理
  • SwizzleMethod 黑魔法
  • Webpack 4 学习01(基础配置)
  • windows下使用nginx调试简介
  • 闭包,sync使用细节
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 机器学习学习笔记一
  • 浅谈Golang中select的用法
  • 仓管云——企业云erp功能有哪些?
  • 带你开发类似Pokemon Go的AR游戏
  • #mysql 8.0 踩坑日记
  • $ git push -u origin master 推送到远程库出错
  • $(selector).each()和$.each()的区别
  • $.ajax()
  • (二)windows配置JDK环境
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)计算机毕业设计ssm电影分享网站
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (四) Graphivz 颜色选择
  • (转)http协议
  • (转)shell中括号的特殊用法 linux if多条件判断
  • .CSS-hover 的解释
  • .libPaths()设置包加载目录
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET 的程序集加载上下文
  • .net 简单实现MD5
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .net 受管制代码