InnoDB参数之explicit_defaults_for_timestamp

explicit_defaults_for_timestamp

    1)全局\会话级、动态变量,默认值 OFF,取值范围:OFF/ON
    2)当explicit_defaults_for_timestamp为OFF时:
        1)表里的第一个timestamp列,如果没有明确指定null、DEFAULT 、ON UPDATE属性的话,Mysql默认会赋予该列DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP属性
        2)不是表里的第一个timestamp列,如果没有明确指定null、DEFAULT 属性的话,Mysql默认会赋予该列 DEFAULT '0000-00-00 00:00:00'(如果sql_mode里有STRICT_ALL_TABLES或者STRICT_TRANS_TABLES或者NO_ZERO_DATE的话,该列在创建时会报错)
        3)The nonstandard behaviors just described are deprecated and will be removed in a future MySQL release.

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

mysql> show variables like '%sql_mode%';
+---------------+------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value                                                                                                                  |
+---------------+------------------------------------------------------------------------------------------------------------------------+
| sql_mode      | STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+---------------+------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> create table test0705(a timestamp);
Query OK, 0 rows affected (0.01 sec)

mysql> show create table test0705\G
*************************** 1. row ***************************
       Table: test0705
Create Table: CREATE TABLE `test0705` (
  `a` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> alter table test0705 add b timestamp;
ERROR 1067 (42000): Invalid default value for 'b'
mysql> alter table test0705 add b timestamp null;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

     3)当explicit_defaults_for_timestamp为ON时:
        1)timestamp列,如果不明确指定not null的话,默认是null,也允许null,不会有null转换成CURRENT_TIMESTAMP的情况
        2)timestamp列指定为not null但是没有指定default value的话,
如果sql_mode里有STRICT_ALL_TABLES或者STRICT_TRANS_TABLES或者NO_ZERO_DATE的话,插入和更新会报错,
如果sql_mode里没有STRICT_ALL_TABLES或者STRICT_TRANS_TABLES或者NO_ZERO_DATE的话,not null但是没有指定default value的列会插入'0000-00-00 00:00:00'

mysql> set session explicit_defaults_for_timestamp=ON;
Query OK, 0 rows affected (0.00 sec)

mysql> create table test0706(a timestamp,b timestamp);
Query OK, 0 rows affected (0.02 sec)

mysql> show create table test0706\G
*************************** 1. row ***************************
       Table: test0706
Create Table: CREATE TABLE `test0706` (
  `a` timestamp NULL DEFAULT NULL,
  `b` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> alter table test0706 add c timestamp not null;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show create table test0706\G
*************************** 1. row ***************************
       Table: test0706
Create Table: CREATE TABLE `test0706` (
  `a` timestamp NULL DEFAULT NULL,
  `b` timestamp NULL DEFAULT NULL,
  `c` timestamp NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> insert into test0706(a,b) values (null,null);
ERROR 1364 (HY000): Field 'c' doesn't have a default value

mysql> set session sql_mode='';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> insert into test0706(a,b) values (null,null);
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from test0706;
+------+------+---------------------+
| a    | b    | c                   |
+------+------+---------------------+
| NULL | NULL | 0000-00-00 00:00:00 |
+------+------+---------------------+

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值