欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MySQL--时间戳属性2

程序员文章站 2022-05-17 16:14:42
在MySQL 5.6版本中引入参数explicit_defaults_for_timestamp设置,该参数会影响Timestamp的默认属性。 同时在MySQL 5.6版本中中,去除一张表只能有一个TIMESTAMP列的限制,允许单表中使用多个时间戳列。 在MySQL 5.6中,当参数explic ......

在mysql 5.6版本中引入参数explicit_defaults_for_timestamp设置,该参数会影响timestamp的默认属性。

同时在mysql 5.6版本中中,去除一张表只能有一个timestamp列的限制,允许单表中使用多个时间戳列。

===============================================================================

在mysql 5.6中,当参数explicit_defaults_for_timestamp=off时:

1、timestamp列如果没有明确指定为nll,则默认为not null
2、timestamp列如果明确指定为null,则会增加默认值null
3、表中第一个timestamp列,如果没有声明为null属性、default或者 on update,会自动分配 default current_timestamp和on update current_timestamp 属性。
4、表中第二个timestamp列,如果没有声明为null或者default子句,默认自动分配’0000-00-00 00:00:00′。插入行时没有指明改列的值,该列默认分配’0000-00-00 00:00:00′,且没有警告。

如使用下面脚本创建:
create table tb2004(
id int primary key,
c1 timestamp,
c2 timestamp,
c3 timestamp);
然后show create table tb2004会发现创建脚本为:
create table `tb2004` (
  `id` int(11) not null,
  `c1` timestamp not null default current_timestamp on update current_timestamp,
  `c2` timestamp not null default '0000-00-00 00:00:00',
  `c3` timestamp not null default '0000-00-00 00:00:00',
  primary key (`id`)
) engine=innodb default charset=utf8

 

===============================================================================

在mysql 5.6中,当参数explicit_defaults_for_timestamp=on时:

1、timestamp列如果没有明确指定为not nll则默认为null
2、表中timestamp列声明为not null时,则不会为列自动创建默认值,且该列不能显式插入null值。
3、表中第一个timestamp列不会自动分配 default current_timestamp和on update current_timestamp 属性,需要显式声明。
4、表中第二各timestamp列与第一个timestamp列不会存在特殊设置。

如使用下面脚本创建:
create table tb2004(
id int primary key,
c1 timestamp,
c2 timestamp,
c3 timestamp);
然后show create table tb2004会发现创建脚本为:
create table `tb2004` (
  `id` int(11) not null,
  `c1` timestamp null default null,
  `c2` timestamp null default null,
  `c3` timestamp null default null,
  primary key (`id`)
) engine=innodb default charset=utf8

而如使用下面脚本创建:
create table tb2005(
id int primary key,
c1 timestamp not null,
c2 timestamp not null,
c3 timestamp not null);
然后show create table tb2005会发现创建脚本为:
create table `tb2005` (
  `id` int(11) not null,
  `c1` timestamp not null,
  `c2` timestamp not null,
  `c3` timestamp not null,
  primary key (`id`)
) engine=innodb default charset=utf8

 

=================================================================

在mysql5.7.8及之后版本中,参数sql_mode的默认值为:

only_full_group_by 
strict_trans_tables 
no_zero_in_date 
no_zero_date 
error_for_division_by_zero 
no_auto_create_user 
no_engine_substitution

 

其中no_zero_in_date和no_zero_date会严格限制时间字段和时间戳字段的值:

no_zero_in_date:要求年月日都为0或月日不为0
no_zero_date:要求年月日中任一项不为0

MySQL--时间戳属性2

当sql_mode中同时包含no_zero_in_date和no_zero_date时,则不允许向时间字段和时间戳字段插入任何非法日期的值,即不允许插入'0000-00-00 00:00:00'的值。