• mysql explicit_defaults_for_timestamp参数


    在mysql中:
    - timestamp列如果没有显式定义为null,默认会被设置为not null属性。(其它的数据类型如果没有显式定义为not null,默认是可以为null的)。设置timestamp的列值为null,会自动存储为当前timestamp
    - 表中的第一个timestamp列,如果没有定义为null、定义default值或者on update,会自动分配default current_timestamp和on update current_timestamp属性
    - 表中第一个timestamp列之后的所有timestamp列,如果没有被定义为null、定义default值,会自动被指定默认值'0000-00-00 00:00:00'。在插入时,如果没有指定这些列的值,会自动指定为'0000-00-00 00:00:00',且不会产生警告

     1 mysql> create table timestamp_eg(
     2     ->     id int not null auto_increment,
     3     ->     time1 timestamp,
     4     ->     time2 timestamp,
     5     ->     time3 timestamp NOT NULL DEFAULT '2010-01-01 00:00:00',
     6     ->     time4 timestamp,
     7     ->     primary key(id));
     8 Query OK, 0 rows affected (0.01 sec)
     9  
    10 mysql> insert into timestamp_eg(id) values(1);
    11 Query OK, 1 row affected (0.00 sec)
    12  
    13 mysql> select * from timestamp_eg;
    14 +----+---------------------+---------------------+---------------------+---------------------+
    15 | id | time1               | time2               | time3               | time4               |
    16 +----+---------------------+---------------------+---------------------+---------------------+
    17 |  1 | 2015-12-16 09:23:33 | 0000-00-00 00:00:00 | 2010-01-01 00:00:00 | 0000-00-00 00:00:00 |
    18 +----+---------------------+---------------------+---------------------+---------------------+
    19 1 row in set (0.01 sec)
    20  
    21 mysql> update timestamp_eg set id=2 where id=1;
    22 Query OK, 1 row affected (0.02 sec)
    23 Rows matched: 1  Changed: 1  Warnings: 0
    24  
    25 mysql> select * from timestamp_eg;
    26 +----+---------------------+---------------------+---------------------+---------------------+
    27 | id | time1               | time2               | time3               | time4               |
    28 +----+---------------------+---------------------+---------------------+---------------------+
    29 |  2 | 2015-12-16 09:25:01 | 0000-00-00 00:00:00 | 2010-01-01 00:00:00 | 0000-00-00 00:00:00 |
    30 +----+---------------------+---------------------+---------------------+---------------------+
    31 1 row in set (0.00 sec)
    32  
    33 mysql> insert into timestamp_eg(id,time4) values(3,'2011-01-01 00:00:00');
    34 Query OK, 1 row affected (0.00 sec)
    35  
    36 mysql> select * from timestamp_eg;
    37 +----+---------------------+---------------------+---------------------+---------------------+
    38 | id | time1               | time2               | time3               | time4               |
    39 +----+---------------------+---------------------+---------------------+---------------------+
    40 |  2 | 2015-12-16 09:25:01 | 0000-00-00 00:00:00 | 2010-01-01 00:00:00 | 0000-00-00 00:00:00 |
    41 |  3 | 2015-12-16 09:28:04 | 0000-00-00 00:00:00 | 2010-01-01 00:00:00 | 2011-01-01 00:00:00 |
    42 +----+---------------------+---------------------+---------------------+---------------------+
    43 2 rows in set (0.00 sec)
    44  
    45 mysql> update timestamp_eg set id=4 where id=3;
    46 Query OK, 1 row affected (0.00 sec)
    47 Rows matched: 1  Changed: 1  Warnings: 0
    48  
    49 mysql> select * from timestamp_eg;
    50 +----+---------------------+---------------------+---------------------+---------------------+
    51 | id | time1               | time2               | time3               | time4               |
    52 +----+---------------------+---------------------+---------------------+---------------------+
    53 |  2 | 2015-12-16 09:25:01 | 0000-00-00 00:00:00 | 2010-01-01 00:00:00 | 0000-00-00 00:00:00 |
    54 |  4 | 2015-12-16 09:28:24 | 0000-00-00 00:00:00 | 2010-01-01 00:00:00 | 2011-01-01 00:00:00 |
    55 +----+---------------------+---------------------+---------------------+---------------------+
    56 2 rows in set (0.00 sec)
    57  
    58 mysql>

    从MySQL5.6.6这种默认设置的方法被废弃了。在MySQL启动时会出现以下警告:

    1 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated.
    2 Please use --explicit_defaults_for_timestamp server option (see
    3 documentation for more details).

    要想取消该警告,在启动mysql时,my.cnf中加入

    1 [mysqld]
    2 explicit_defaults_for_timestamp=true

    修改该参数后,timestamp类型的列的处理方式也会发生变化:

    - timestamp列如果没有显式定义为not null,则支持null属性。设置timestamp的列值为null,就不会被设置为current timestamp
    - 不会自动分配default current_timestamp和on update current_timestamp属性,这些属性必须显式指定
    - 声明为not null且没有显式指定默认值是没有默认值的。表中插入列,又没有给timestamp列赋值时,如果是严格sql模式,会抛出一个错误;如果严格sql模式没有启用,该列会赋值为’0000-00-00 00:00:00′,同时出现一个警告。(这和mysql处理其它时间类型数据一样,如datetime)

     

     1 mysql> create table timestamp_02(
     2     -> id int not null auto_increment,
     3     -> time1 timestamp not null,
     4     -> primary key(id)
     5     -> );
     6 Query OK, 0 rows affected (0.03 sec)
     7  
     8 mysql> insert into timestamp_02(id) values(1);
     9 ERROR 1364 (HY000): Field 'time1' doesn't have a default value
    10 mysql>

     

  • 相关阅读:
    PostgreSQL学习手册(五) 函数和操作符
    数据表的左连接与右连接
    ESX虚拟机文件列表详解
    程序员生存定律-打造属于自己的稀缺性
    C语言字符串处理函数
    托福听力
    DNS map file in windows
    Ubuntu 下安装VNC server
    PostgreSQL 数据库错误状态编号解释[附带列表
    [留学新生须知]新生美国生活常用单词汇总
  • 原文地址:https://www.cnblogs.com/zqifa/p/mysql-3.html
Copyright © 2020-2023  润新知