设置TIMESTAMP和DATETIME的自动初始化及自动更新

作者: 数据库信息  发布:2019-06-23
CREATE TABLE t1 (
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);

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,不做其余改动,基本上是面容输入和输出。

 

下边,大家来证圣元(Synutra)(Beingmate)下

 

先是成立三种测试表,一个施用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,且不限量数量。

一、MySQL中如何表示近期天子? 其实,表达格局照旧蛮多的,汇总如下: CULANDRENT_TIMESTAMP CURRENT_TIMESTAMP() N...

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);

由于以往时刻档次基本都用DATETIME(因为TIMESTAMP的界定不大局限性也相当大),由此5.6.5自此DATETIME也促成了这几个效果。

  • DATETIME也能够像TIMESTAMP同样将CU索罗德RENT_TIMESTAMP设为暗许值
  • 假若您为此时间列设置了自动更新的质量,那么一旦一条记下的其余任何列值发生改造,时间列都会自动更新为CULacrosseRENT_TIMESTAMP。
CREATE TABLE t1 (
ts TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP,
dt DATETIME DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP
);

对此本次创立的3个表:

 

TIMESTAMP类型:

3)

1)

其它此参数在8.0.1第11中学晋升已经要渐渐弃用了。

近期有多个关于MySQL版本晋级的事,涉及到部分有关时间档期的顺序的内部境况问题亟待应用钻探,由此到官方网址找到相关作品,翻出来相比低价温馨精晓,博客这里也贴一下。

在5.6.5事先,以上timestamp的展现能够算是他对照datetime的八个优势,也会有人把它视为一个BUG以为她很麻烦,但不管怎么样在5.6.5事先要是您有将CUXC90RENT_TIMESTAMP设为默许值的急需,那您不得不采用timestamp类型,幸亏5.6.5今后datetime也扶助了。

    自立异的DATETIME列若是未设置私下认可值且定义了not null,那么暗许值为0。

2)

参照官方网站网站:

本文由金沙澳门官网发布于数据库信息,转载请注明出处:设置TIMESTAMP和DATETIME的自动初始化及自动更新

关键词: 金沙澳门官网