澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

timestamp自动更新和先导化

新近有一个有关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,不做其余改变,基本上是面容输入和出口。

 

上边,大家来说美素佳儿(Friso)(Aptamil)下

 

率先创造三种测量检验表,多少个采纳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所能存款和储蓄的小时范围为:'1968-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 CU奔驰M级RENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP”。

 

实则,这么些特点是电动初步化和自动更新(Automatic Initialization and Updating)。

 

自行开始化指的是假诺对该字段(举例上例中的hiredate字段)未有显性赋值,则自动安装为当下系统时间。

 

自动更新指的是一旦改换了任何字段,则该字段的值将自动更新为当下系统时间。

 

它与“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中怎么着表示前段时间光阴? 其实,表明格局如故蛮多的,汇总如下: CU奥德赛RENT_TIMESTAMP CURRENT_TIMESTAMP() N...

MySQL中有关TIMESTAMP和DATETIME的总结,timestampdatetime

一、MySQL中如何表示方今时刻?

实际,表明格局还是蛮多的,汇总如下:

CURRENT_TIMESTAMP

CURRENT_澳门新浦京娱乐场网站,TIMESTAMP()

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,不做任何改造,基本上是外貌输入和出口。

 

上面,我们来讲贝拉米(Bellamy)下

率先创立二种测量检验表,三个利用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所能存款和储蓄的年月范围为:'一千-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 CU科雷傲RENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP”。

实质上,那一个特点是自行开始化和自动更新(Automatic Initialization and Updating)。

机关初阶化指的是一旦对该字段(举例上例中的hiredate字段)未有显性赋值,则自动安装为当下系统时间。

自动更新指的是只要退换了别样字段,则该字段的值将自动更新为最近系统时间。

它与“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,且不限量数量。

 

参考:

1. 

2. 

3. 

一、MySQL中怎么样表示近来光阴? 其实,表明方式仍然蛮多的,汇总如下: CURubiconRENT_TIMESTAMP C...

1.概述

正文将因此实例比较MySQL中的datetime与timestamp,即使这两种方法其实表示无差距种档案的次序,但要么有料定的分裂。

参照官方网站网址:

在大家设计表的时候,缅怀将行数据的始建时间和尾声更新时间记录下来是很好的推行。尤其是大概必要做多少同步依旧对数据新鲜度有供给的表。举些应用场景,更新距上次立异抢先2钟头的行数据,可能是将5个月前的订单数量归档等等。大家想把这一个的须求丢给数据库服务器处理,而不是在应用程序中对每一条语句设置成立时间和最终更新时间字段。在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类型能够完结自动早先化或更新为CURubiconRENT_TIMESTAMP的效率,在5.6.5以前这些特点唯有TIMESTAMP才干用。

澳门新浦京娱乐场网站 1

  不同

是因为未来岁月项目基本都用DATETIME(因为TIMESTAMP的限量非常的小局限性也相当的大),由此5.6.5之后DATETIME也兑现了那一个功用。

事例极其轻便,结果也很明朗,笔者就不加赘述了。

  范围

本条职能详细描述下正是:

3.思考

  datetime 以YYYY-MM-DD HH:MM:SS格式检索和出示DATETIME值。帮助的范围为一千-01-01 00:00:00到9999-12-31 23:59:59TIMESTAMP值不可能早于1967或晚于2037

  • DATETIME也得以像TIMESTAMP同样将CUPRADORENT_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个字节积累(Time 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事先假若您有将CUOdysseyRENT_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

  今后自家来做个时区对她们的熏陶。

要是您要安装叁个活动开端化 自动更新为CU昂CoraRENT_TIMESTAMP的时间列(TIMESTAMP or DATETIME),那么使用“DEFAULT CU奥迪Q3RENT_TIMESTAMP” “ON UPDATE CURRENT_TIMESTAMP”的组合,定义的顺序无所谓,可替代CUEnclaveRENT_TIMESTAMP的根本字有:CUHavalRENT_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 的其它的属性

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)自立异的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列的显得格式...

对于此番创造的3个表:

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

  • 3个表的第三个timestamp列都并未有自行初叶化和自动更新的性质。(自动初阶化是指调用的种类时间函数)
  • 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自动更新和先导化