澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

澳门新萄京官方网站timestamp自动更新和初始化

2019-11-04 作者:数据库网络   |   浏览(161)

近些日子有二个关于MySQL版本晋级的事,涉及到有个别有关时间档案的次序的内部情形难题亟需侦察,由此到官方网址找到相关小说,翻出来相比便于温馨驾驭,博客这里也贴一下。

MySQL中有关TIMESTAMP和DATETIME的总结

意气风发、MySQL中哪些表示近日时光?

 

事实上,表达格局仍然蛮多的,汇总如下:

 

CURRENT_TIMESTAMP

 

CURRENT_TIMESTAMP()

 

NOW()

 

LOCALTIME

 

LOCALTIME()

 

LOCALTIMESTAMP

 

LOCALTIMESTAMP()

 

二、关于TIMESTAMP和DATETIME的比较

 

二个完全的日子格式如下:YYYY-MM-DD HH:MM:SS[.fraction],它可分为两部分:date部分和time部分,此中,date部分对应格式中的“YYYY-MM-DD”,time部分对应格式中的“HH:MM:SS[.fraction]”。对于date字段来说,它只援救date部分,要是插入了time部分的开始和结果,它会丢掉掉该片段的内容,并提醒一个warning。

 

正如所示:

mysql> create table test(id int,hiredate date);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into test values(1,'20151208000000');
Query OK, 1 row affected (0.00 sec)

mysql> insert into test values(1,'20151208104400');
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> show warning;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'warning' at line 1
mysql> select * from test;
 ------ ------------ 
| id   | hiredate   |
 ------ ------------ 
|    1 | 2015-12-08 |
|    1 | 2015-12-08 |
 ------ ------------ 
2 rows in set (0.00 sec)

注:第多个没提示warning的来由在于它的time部分都以0

 

TIMESTAMP和DATETIME的相符点:

 

1> 两个都可用来代表YYYY-MM-DD HH:MM:SS[.fraction]品类的日子。

 

TIMESTAMP和DATETIME的分化点:

 

1> 两者的存款和储蓄格局不相同样

 

对于TIMESTAMP,它把顾客端插入的时日从此以后时此刻时区转变为UTC(世界标按期期卡塔 尔(阿拉伯语:قطر‎进行仓储。查询时,将其又转车为客商端当前时区实行再次回到。

 

而对于DATETIME,不做任何改变,基本上是面容输入和输出。

 

上面,大家来证美赞臣下

 

先是创制三种测量检验表,叁个行使timestamp格式,二个行使datetime格式。

mysql> create table test(id int,hiredate timestamp);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into test values(1,'20151208000000');
Query OK, 1 row affected (0.00 sec)

mysql> create table test1(id int,hiredate datetime);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into test1 values(1,'20151208000000');
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
 ------ --------------------- 
| id   | hiredate            |
 ------ --------------------- 
|    1 | 2015-12-08 00:00:00 |
 ------ --------------------- 
1 row in set (0.01 sec)

mysql> select * from test1;
 ------ --------------------- 
| id   | hiredate            |
 ------ --------------------- 
|    1 | 2015-12-08 00:00:00 |
 ------ --------------------- 
1 row in set (0.00 sec)

两岸输出是雷同的。

 

帮助改良当前对话的时区

mysql> show variables like '%time_zone%'; 
 ------------------ -------- 
| Variable_name    | Value  |
 ------------------ -------- 
| system_time_zone | CST    |
| time_zone        | SYSTEM |
 ------------------ -------- 
2 rows in set (0.00 sec)

mysql> set time_zone=' 0:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select * from test;
 ------ --------------------- 
| id   | hiredate            |
 ------ --------------------- 
|    1 | 2015-12-07 16:00:00 |
 ------ --------------------- 
1 row in set (0.00 sec)

mysql> select * from test1;
 ------ --------------------- 
| id   | hiredate            |
 ------ --------------------- 
|    1 | 2015-12-08 00:00:00 |
 ------ --------------------- 
1 row in set (0.01 sec)

上述“CST”指的是MySQL所在主机的连串时间,是炎黄标如时期的缩写,China Standard Time UT 8:00

 

经过结果能够看出,test中回到的年月提前了8个钟头,而test第11中学时间则不变。那丰富证实了双面包车型大巴区分。

 

2> 两个所能存款和储蓄的日子范围不相仿

 

timestamp所能存款和储蓄的年华范围为:'一九六八-01-01 00:00:01.000000' 到 '2038-01-19 03:14:07.999999'。

 

datetime所能存款和储蓄的时间节制为:'1000-01-01 00:00:00.000000' 到 '9999-12-31 23:59:59.999999'。

 

小结:TIMESTAMP和DATETIME除了存款和储蓄范围和仓库储存情势不平等,未有太大分别。当然,对于跨时区的业务,TIMESTAMP更为合适。

 

三、关于TIMESTAMP和DATETIME的机关开首化和换代

 

率先,大家先看一下上边包车型客车操作

 

mysql> create table test(id int,hiredate timestamp);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into test(id) values(1);
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
 ------ --------------------- 
| id   | hiredate            |
 ------ --------------------- 
|    1 | 2015-12-08 14:34:46 |
 ------ --------------------- 
1 row in set (0.00 sec)

mysql> show create table testG
*************************** 1. row ***************************
       Table: test
Create Table: CREATE TABLE `test` (
  `id` int(11) DEFAULT NULL,
  `hiredate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

看起来是否有一些奇异,作者并不曾对hiredate字段举行插队操作,它的值自动改正为近日值,何况在成立表的时候,作者也并不曾概念“show create table testG”结果中显得的“ DEFAULT CUEscortRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP”。

 

实在,那本本性是机关初阶化和自动更新(Automatic Initialization and Updating卡塔尔。

 

活动开头化指的是只要对该字段(举个例子上例中的hiredate字段卡塔 尔(英语:State of Qatar)未有显性赋值,则自动安装为近日系统时间。

 

自动更新指的是借使退换了此外字段,则该字段的值将自动更新为日前系统时间。

 

它与“explicit_defaults_for_timestamp”参数有关。

 

暗中认可景况下,该参数的值为OFF,如下所示:

mysql> show variables like '%explicit_defaults_for_timestamp%';
 --------------------------------- ------- 
| Variable_name                   | Value |
 --------------------------------- ------- 
| explicit_defaults_for_timestamp | OFF   |
 --------------------------------- ------- 
1 row in set (0.00 sec)

下边我们看看官档的辨证:

 

By default, the first TIMESTAMP column has both DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP if neither is specified explicitly。

 

超级多时候,那并非大家想要的,如何禁用呢?

 

  1. 将“explicit_defaults_for_timestamp”的值设置为ON。

 

2. “explicit_defaults_for_timestamp”的值仍然是OFF,也是有三种艺术能够禁止使用

 

     1> 用DEFAULT子句该该列钦赐叁个私下认可值

 

     2> 为该列钦命NULL属性。

 

如下所示:

mysql> create table test1(id int,hiredate timestamp null);
Query OK, 0 rows affected (0.01 sec)

mysql> show create table test1G
*************************** 1. row ***************************
       Table: test1
Create Table: CREATE TABLE `test1` (
  `id` int(11) DEFAULT NULL,
  `hiredate` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

mysql> create table test2(id int,hiredate timestamp default 0);
Query OK, 0 rows affected (0.01 sec)

mysql> show create table test2G
*************************** 1. row ***************************
       Table: test2
Create Table: CREATE TABLE `test2` (
  `id` int(11) DEFAULT NULL,
  `hiredate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

 

 

在MySQL 5.6.5版本早先,Automatic Initialization and Updating只适用于TIMESTAMP,况兼一张表中,最多允许一个TIMESTAMP字段接纳该天性。从MySQL 5.6.5发端,Automatic Initialization and Updating同不经常间适用于TIMESTAMP和DATETIME,且不限量数量。

意气风发、MySQL中怎样表示近年来时间? 其实,表明格局依然蛮多的,汇总如下: CUPRADORENT_TIMESTAMP CURRENT_TIMESTAMP() N...

1.概述

本文将由此实例比较MySQL中的datetime与timestamp,即便那二种方法其实表示相似种类型,但要么有早晚的分裂。

仿照效法官方网站网站:

在大家设计表的时候,思索将行数据的创导时间和结尾更新时间记录下来是很好的实施。越发是唯恐要求做多少同步照旧对数码新鲜度有要求的表。举些应用途景,更新距上次更新超过2钟头的行数据,可能是将叁个月前的订单数量归档等等。大家想把那一个的要求丢给数据库服务器管理,实际不是在应用程序中对每一条语句设置创造时间和尾声更新时间字段。在mysql中,那落到实处起来非常轻巧。我们要求依附于DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP

  相同

2.简易示例

  显示

一、简介

 1 --创建测试表
 2 CREATE TABLE `timestampTest` (
 3   `id` int(11) NOT NULL AUTO_INCREMENT,
 4   `name` varchar(20) DEFAULT NULL,
 5   `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
 6   `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 7   PRIMARY KEY (`id`)
 8 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
 9 
10 --检测默认值,插入测试数据
11 INSERT INTO timestampTest (name) VALUES ('aa'),('bb'),('cc');
12 
13 --检测自动更新,更新某条数据
14 UPDATE timestampTest SET name = 'ab' WHERE id = 1;

  TIMESTAMP列的彰显格式与DATETIME列相似。换句话说,展现升幅固定在19字符,何况格式为YYYY-MM-DD HH:MM:SS。

自MySQL 5.6.5初叶TIMESTAMP和DATETIME类型能够兑现机关先河化或更新为CU途睿欧RENT_TIMESTAMP的意义,在5.6.5早先这性格格独有TIMESTAMP技巧用。

澳门新萄京官方网站 1

  不同

鉴于以后岁月档案的次序基本都用DATETIME(因为TIMESTAMP的约束异常的小局限性也极大卡塔 尔(英语:State of Qatar),因而5.6.5过后DATETIME也促成了这一个意义。

事例特别轻便,结果也很猛烈,小编就不加赘述了。

  范围

以此意义详细描述下正是:

3.思考

  datetime 以YYYY-MM-DD HH:MM:SS格式检索和展现DATETIME值。扶持的节制为1000-01-01 00:00:00到9999-12-31 23:59:59TIMESTAMP值无法早于一九七〇或晚于2037

  • DATETIME也足以像TIMESTAMP相仿将CUCRUISERRENT_TIMESTAMP设为暗中认可值
  • 假定你为那时候间列设置了自动更新的属性,那么只要一条记下的别的任何列值产生变动,时间列都会自动更新为CU科雷傲RENT_TIMESTAMP。
  • 实行update语句,并没有退换列值(只怕说设置值为当下值),on update current_timestamp列是或不是会更新?

  储存

倘让你不想让设置自动更新属性的日子列随别的列值的转移而改正,你可认为她显式的赋多个值。

    不会,大家能够看一下履行完update后边世的唤起——Rows matched: 1 Changed: 0 Warnings: 0。官方文书档案的表明是

  TIMESTAMP

TIMESTAMP类型:

An auto-updated column remains unchanged if all other columns are set to their current values. To prevent an auto-updated column from updating when other columns change, explicitly set it to its current value. To update an auto-updated column even when other columns do not change, explicitly set it to the value it should have

  1.4个字节积存(提姆e stamp value is stored in 4 bytes)

  • 在8.0.2版本早前,假若您定义了那般二个列:ts timestamp [not null] default xxx,那么除非您显式的给此列赋二个非NULL的值,不然大器晚成律插入的这几天时刻戳,无论你的default值设置的是什么,你能够将其视为叁个BUG。你能够由此将explicit_defaults_for_timestamp设置为ON来防止那几个现象。
  • 在8.0.2本子在此之前,倘使您定义了叁个ts timestamp [not null]列,但未曾安装私下认可值,那么真相上这一个列是ts  timestamp not null default current_timestamp on update current_timestamp,相近的你能够通过设置explicit_defaults_for_timestamp为ON来消除此难点。
  • 当explicit_defaults_for_timestamp为OFF时,除非内定timestamp可为NULL,不然MySQL自动为timestamp设置not null属性。

    澳门新萄京官方网站 2

  2.值以UTC格式保存( it stores the number of milliseconds)

在5.6.5事先,以上timestamp的显示能够算是他对待datetime的一个优势,也是有人把它视为叁个BUG以为他很麻烦,但无论怎么样在5.6.5在此之前倘若您有将CULANDRENT_TIMESTAMP设为默许值的急需,那您一定要接收timestamp类型,辛亏5.6.5以往datetime也支持了。

  • CURRENT_TIMESTAMP,CURRENT_TIMESTAMP(),LOCALTIME,LOCALTIME(),LOCALTIMESTAMP,LOCALTIMESTAMP(),NOW()的关系?

  3.时区转变 ,存款和储蓄时对当前的时区举办转移,检索时再改变回当前的时区。

关于explicit_defaults_for_timestamp参数:

    那多个是同义词关系

  datetime

在MySQL5.6.6引入了explicit_defaults_for_timestamp参数来解决以上timestamp默许值的难点(此参数在8.0.1事先的本子默许是OFF,只读参数卡塔 尔(阿拉伯语:قطر‎,而在MySQL8.0.2从今以往此参数暗许值变为ON而且能够在线订正。将此参数设为ON后您为timestamp列设置的暗中认可值就能够生效了。

  • Timestamp类型的暗中同意值

  1.8个字节积累(8 bytes storage)

今后处能够看出explicit_defaults_for_timestamp=on的效应正是,使得你本身为timestamp列设置的default值生效,当你未安装私下认可值和自创新时MySQL也不会自作主张的为not null时间列增多current_timestamp和on update current_timestamp的暗中同意选项。

    大家探究暗中认可意况(严刻方式卡塔 尔(阿拉伯语:قطر‎下mysql对timestamp类型的拍卖:

  2.实际上格式储存(Just stores what you have stored and retrieves the same thing which you have stored.)

除此以外此参数在8.0.1第11中学唤醒已经要逐年弃用了。

mysql不会给timestamp设置私下认可值,除非显式设置default限定依旧可空null。特例:mysql会给表第三个timestamp类型的字段同不经常候增添default current_timestamp和on update timestamp

  3.与时区非亲非故(It has nothing to deal with the TIMEZONE and Conversion.)

 

禁绝mysql的特例管理有四个法子

  实例相比

二、如何设置时间列(本文如无版本号提醒,示例统一是MySQL5.6的条件卡塔尔国

  1. 设置explicit_defaults_for_timestamp为enable
  2. 显式设置该字段default只怕null

  现在自家来做个时区对她们的震慑。

假诺您要安装二个自动伊始化 自动更新为CUEscortRENT_TIMESTAMP的光阴列(TIMESTAMP or DATETIME卡塔 尔(英语:State of Qatar),那么使用“DEFAULT CU大切诺基RENT_TIMESTAMP” “ON UPDATE CURRENT_TIMESTAMP”的重新组合,定义的顺序不在乎,可代替CU奥迪Q7RENT_TIMESTAMP的首要字有:CU帕杰罗RENT_TIMESTAMP(), NOW(), LOCALTIME, LOCALTIME(), LOCALTIMESTAMP, 以及LOCALTIMESTAMP()。

timestamp列暗中同意not null。未有显式钦定nullable,那么default null非法

  1.先插入三个数量insert into `t8` values(now(), now());

官方网址详细的列出了说不许现身的暗许值 自动更新选项的整合:

任何景况均会滋生不合规报错

  2.变动客户端时区(东9区,日本时区)。

1)

举一些事例,帮忙掌握

  3.重复体现插入的数目,变化了,timestamp类型的数码 扩充了 1个时辰

CREATE TABLE t1 (
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
 1 #语句不合法,出现了两个未显示设置default或null的timestamp
 2 CREATE TABLE `tt1` (
 3   `id` int(11) NOT NULL AUTO_INCREMENT,
 4   `name` varchar(20),
 5   `t1` timestamp ,
 6   `t2` timestamp ,
 7   PRIMARY KEY (`id`)
 8 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
 9 
10 #语句合法,t1字段 not null default current_timestamp on update current_timestamp,t2可空
11 CREATE TABLE `tt2` (
12   `id` int(11) NOT NULL AUTO_INCREMENT,
13   `name` varchar(20),
14   `t1` timestamp ,
15   `t2` timestamp null,
16   PRIMARY KEY (`id`)
17 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
18 
19 #语句不合法 t2字段没有设置default或null,也非表的第一个timestamp字段
20 CREATE TABLE `tt3` (
21   `id` int(11) NOT NULL AUTO_INCREMENT,
22   `name` varchar(20),
23   `t1` timestamp null,
24   `t2` timestamp ,
25   PRIMARY KEY (`id`)
26 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
27 
28 #语句不合法,这个看起来貌似合法,套用我们的规则,可以发现t2字段没有显示指定null/default,尽管指定了not null也不行
29 CREATE TABLE `tt4` (
30   `id` int(11) NOT NULL AUTO_INCREMENT,
31   `name` varchar(20),
32   `t1` timestamp null,
33   `t2` timestamp not null,
34   PRIMARY KEY (`id`)
35 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
36 
37 #语句不合法 t1,t2均合法,问题出在t3上,timestamp 默认not null,在没有显式指定null的时候,default null是不合法的
38 CREATE TABLE `tt5` (
39   `id` int(11) NOT NULL AUTO_INCREMENT,
40   `name` varchar(20),
41   `t1` timestamp not null,
42   `t2` timestamp null,
43   `t3` timestamp DEFAULT null,
44   PRIMARY KEY (`id`)
45 ) ENGINE=InnoDB DEFAULT CHARSET=utf8

澳门新萄京官方网站 3

2)

  小手艺:基本上能用show create table `tablename` 来查看mysql管理后的表定义,下边是tt2那张表的概念,验证了俺们的下结论

澳门新萄京官方网站timestamp自动更新和初始化。  接下去 研究一些timestamp 的别的的性质

CREATE TABLE t1 (
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
dt DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE t1 (
ts TIMESTAMP DEFAULT 0,
dt DATETIME DEFAULT 0
);

  澳门新萄京官方网站 4澳门新萄京官方网站 5

  1.null 是还是不是为空

3)

  • Timestamp和datetime的异同

  timestamp 默许允许为 “非空”(not null by default), 假若你在概念“ts TIMESTAMP DEFAULT NULL” 是违法的。 能够钦赐为空 null ,“ts TIMESTAMP NULL" ,那个时候能够在增加语句退换暗中同意值。

CREATE TABLE t1 (
ts TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP,
dt DATETIME DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP
);

 

  ts2 TIMESTAMP NULL DEFAULT 0,ts3 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP

4卡塔 尔(英语:State of Qatar)自修改的timestamp列假如未设置默许值且未明朗钦定可为NULL,则暗中认可值为0,0代表0000-00-00 00:00:00。

timestamp

  default (多少个表中只可以有三个列采取上边在那之中黄金年代种)

CREATE TABLE t1 (
ts1 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- default 0
ts2 TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP -- default NULL
);
CREATE TABLE t1 (
dt1 DATETIME ON UPDATE CURRENT_TIMESTAMP, -- default NULL
dt2 DATETIME NOT NULL ON UPDATE CURRENT_TIMESTAMP -- default 0
);

datetime

  default CURRENT_TIMESTAMP default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

    自修改的DATETIME列如若未安装默许值且定义了not null,那么默许值为0。

  ON UPDATE CURRENT_TIMESTAMP

5)

可自动更新和开首化,默许展现格式相仿YYYY-MM-dd HH:mm:ss

  ON UPDATE 见上2

CREATE TABLE t1 (
ts1 TIMESTAMP DEFAULT 0,
ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP);
CREATE TABLE t2 (
ts1 TIMESTAMP NULL,
ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP);
CREATE TABLE t3 (
ts1 TIMESTAMP NULL DEFAULT 0,
ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP);

澳门新萄京官方网站timestamp自动更新和初始化。异

相似 呈现 TIMESTAMP列的来得格式...

对于此番创设的3个表:

'1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC

  • 3个表的首先个timestamp列都还未活动初叶化和自动更新的品质。(自动初阶化是指调用的系统时间函数卡塔 尔(英语:State of Qatar)
  • 3个表的间隔在于ts1列对NULL值的管理,t1.ts1非空,当你为她赋值为NULL时插入的实际上是现阶段光阴戳,t2.ts1,t3.ts1允许null值,因而当你插入NULL时最终被插入的正是NULL。
  • t2和t3对于ts1的默许值管理也不等同,t2.ts1允许null值且未定义私下认可值,由此暗中同意值正是NULL,t3.ts1同意null值且定义了default 0,由此暗许值正是0。

电动时区转变,实际存款和储蓄纳秒数,4字节囤积

'1000-01-01 00:00:00' to '9999-12-31 23:59:59'

不扶持时区,8字节积累

4.参考

1.Automatic Initialization and Updating for TIMESTAMP and DATETIME

2.Date and Time Functions

本文由澳门新萄京官方网站发布于数据库网络,转载请注明出处:澳门新萄京官方网站timestamp自动更新和初始化

关键词: