mysql多个TimeStamp设置(转)
原文地址:http://www.cnblogs.com/yjf512/archive/2012/11/02/2751058.html
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:这三种方法的取舍就完全看你自己的考虑了。顺便说一下,最后,我还是选择第三种方法。
mysql多个TimeStamp设置(转)的更多相关文章
- mysql多个TimeStamp设置
mysql多个TimeStamp设置 2012-11-02 12:58 轩脉刃 阅读(39590) 评论(3) 编辑 收藏 timestamp设置默认值是Default CURRENT_TI ...
- mysql多个TimeStamp设置(转)
timestamp设置默认值是Default CURRENT_TIMESTAMP timestamp设置随着表变化而自动更新是ON UPDATE CURRENT_TIMESTAMP 但是由于 一个表中 ...
- mysql中单表多timestamp设置default问题
mysql中,同一个表多个timesatmp字段设置default的时候,经常会报错. 一个表只能有一个设置default的字段. 但是有时只有一个字段设置default也会报错. 会报:Incorr ...
- Mysql_mysql多个TimeStamp设置
timestamp设置默认值是Default CURRENT_TIMESTAMP timestamp设置随着表变化而自动更新是ON UPDATE CURRENT_TIMESTAMP 但是由于 一个表中 ...
- MySQL datetime 和 timestamp 的区别
[转载]:MySQL中有关TIMESTAMP和DATETIME的总结 1. datetime 和 timestamp 的相同点 两者都可以用来表示YYYY-MM-DD HH:MM:SS[.fracti ...
- mysql的sql_mode合理设置
mysql的sql_mode合理设置 sql_mode是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入.在生产环境必须将这个值设置为严格模式,所以 ...
- golang github.com/go-sql-driver/mysql 遇到的数据库,设置库设计不合理的解决方法
golang github.com/go-sql-driver/mysql 遇到的数据库,设置库设计不合理的解决方法,查询中报了以下这个错 Scan error on column index 2: ...
- (转)mysql账号权限密码设置方法
原文:http://www.greensoftcode.net/techntxt/2013410134247568042483 mysql账号权限密码设置方法 我的mysql安装在c:\mysql 一 ...
- Wamp Mysql错误消息 语言设置
Wamp Mysql错误消息 语言设置 http://my.oschina.net/wandershi/blog/264347 打开my.ini 找到 [wampmysqld] port = 33 ...
随机推荐
- HDU3336 Count the string
居然一A了,说明对朴素的KMP还是有一定理解. 主要就是要知道next数组的作用,然后就可以计算每个i结尾的满足题意的串个数. #include<cstdio> #include<c ...
- ZOJ2402 Lenny's Lucky Lotto List 简单DP
Lenny's Lucky Lotto Lists Time Limit: 2 Seconds Memory Limit:65536 KB Lenny likes to play the g ...
- 启用事务操作,解决批量插入或更新sqlite,mssql等数据库耗时问题
private void button1_Click(object sender, EventArgs e) { //Sqlite使用事务批量操作 极大的提高速度 DateTime starttime ...
- springboot使用zookeeper(curator)实现注册发现与负载均衡
最简单的实现服务高可用的方法就是集群化,也就是分布式部署,但是分布式部署会带来一些问题.比如: 1.各个实例之间的协同(锁) 2.负载均衡 3.热删除 这里通过一个简单的实例来说明如何解决注册发现和负 ...
- cocos2dx - 创建地图及玩家(伪)
接上一节内容:cocos2dx - 环境配置,项目创建 本节主要描述cocos中精灵的创建及点击事件的使用 打开创建好的test项目,看到下图的目录结构,真正的游戏逻辑路径在src下. AppDele ...
- visual Studio 无法调试,提示程序跟踪已退出
今天在打码出现了vs无法调试,我在网上查了很久没有发现一个方法. vs点击启动时,出现了一下提示 程序"[12648] *.vshost.exe: 程序跟踪"已退出,返回值为 0 ...
- mySQL:两表更新(用一个表更新另一个表)的SQL语句
用一个表中的字段去更新另外一个表中的字段, MySQL 中有相应的 update 语句来支持,不过这个 update 语法有些特殊.看一个例子就明白了. create table student ( ...
- 从零起步学python计划及感想
从纯传统bi转型过来的技术顾问,比较有优势的是对业务的熟悉,对数据有敏感度,熟悉数据模型.但是长年累月基本都是用sql处理问题.目前还没有经历过sql解决不了的问题,一个sql解决不了就用临时表,几个 ...
- Java基础笔记8
Object类 Object类是所有类的父类. 如果某个类没有显示的继承某个父类,那么该类则继承Object. 类 Object 是类层次结构的根类.每个类都使用 Object 作为超类. 所有对象( ...
- Web设计新手应知道的10个锦囊妙计
摘要:你在网页设计所学到的大多数教训都来自工作经验.学习是一个反复持续的过程,并且没有比犯错更好的方式来获得知识.在本文中,我们将讨论10个重要并常规的技巧,这是每位Web设计师新手都应该知道. 在做 ...