zoukankan      html  css  js  c++  java
  • 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>

     

  • 相关阅读:
    入门菜鸟
    FZU 1202
    XMU 1246
    Codeforces 294E Shaass the Great 树形dp
    Codeforces 773D Perishable Roads 最短路 (看题解)
    Codeforces 814E An unavoidable detour for home dp
    Codeforces 567E President and Roads 最短路 + tarjan求桥
    Codeforces 567F Mausoleum dp
    Codeforces 908G New Year and Original Order 数位dp
    Codeforces 813D Two Melodies dp
  • 原文地址:https://www.cnblogs.com/zqifa/p/mysql-3.html
Copyright © 2011-2022 走看看