Mysqlデータ型---TIMESTAMP

14871 ワード

ラベル(スペース区切り):MYSQL
TIMESTAMPタイプは4バイトを使用しており、「1970-01-01 00:00:01.00000」から「2038-01-19 03:14:07.9999999」までの範囲である.
MySQLは、TIMESTAMP値を'YYYY-MM-DD HH:MM:SS'形式で表示し、表示幅を19文字に固定します.数値を取得する場合は、TIMESTAMP列に+0を追加します.
TIMESTAMPフィールドは、INSERTまたはUPDATE操作時に日時を記録するために使用されます.値を割り当てない場合、テーブルの最初のTIMESTAMPフィールドは自動的に最近の操作の日付と時間に設定されます.また、NULL値を割り当てることで、TIMESTAMP列を現在の日時に設定することもできます.
TIMESTAMPフィールド定義
現在のタイムスタンプを使用して、値の初期化と自動更新、またはそのいずれかを行うことができます.たとえば、定義時に自動更新を指定できますが、初期化されません.
1.定義時にDEFAULT CURRENT_TIMESTAMPとON UPDATE CURRENT_TIMESTAMP句はすべてあって、列の値はデフォルトで現在のタイムスタンプを使って、そして自動的に更新します
CREATE TABLE  tb1( 
    id   INTEGER,
    t1   TIMESTAMP DEFAULT CURRENT_TIMESTAMP  ON UPDATE CURRENT_TIMESTAMP
 );


mysql> DESC tb1;
+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type      | Null | Key | Default           | Extra                       |
+-------+-----------+------+-----+-------------------+-----------------------------+
| id    | int(11)   | YES  |     | NULL              |                             |
| t1    | timestamp | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------+-----------+------+-----+-------------------+-----------------------------+
2 rows in set (0.00 sec)


mysql> INSERT INTO tb1(id) values(1);
Query OK, 1 row affected (0.10 sec)

mysql> select * from tb1;
+------+---------------------+
| id   | t1                  |
+------+---------------------+
|    1 | 2017-08-30 12:07:00 |
+------+---------------------+
1 row in set (0.00 sec)


mysql> UPDATE tb1 SET id=2 WHERE id=1;
Query OK, 1 row affected (0.20 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from tb1;
+------+---------------------+
| id   | t1                  |
+------+---------------------+
|    2 | 2017-08-30 12:07:55 |
+------+---------------------+
1 row in set (0.00 sec)

2.DEFAULTまたはON UPDATE句を使用しない場合、DEFAULT CURRENT_と同等です.TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
CREATE TABLE  tb2( 
        id   INTEGER,
        t1    TIMESTAMP
);

mysql> DESC tb2;
+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type      | Null | Key | Default           | Extra                       |
+-------+-----------+------+-----+-------------------+-----------------------------+
| id    | int(11)   | YES  |     | NULL              |                             |
| t1    | timestamp | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------+-----------+------+-----+-------------------+-----------------------------+
2 rows in set (0.00 sec)

3 DEFAULT CURRENTのみの場合TIMESTAMP句、ON UPDATE句なし、列値のデフォルトは現在のタイムスタンプですが、自動的に更新されません
 CREATE TABLE  tb3( 
        id   INTEGER,
        t1    TIMESTAMP  DEFAULT CURRENT_TIMESTAMP
);

mysql> DESC tb3;
+-------+-----------+------+-----+-------------------+-------+
| Field | Type      | Null | Key | Default           | Extra |
+-------+-----------+------+-----+-------------------+-------+
| id    | int(11)   | YES  |     | NULL              |       |
| t1    | timestamp | NO   |     | CURRENT_TIMESTAMP |       |
+-------+-----------+------+-----+-------------------+-------+
2 rows in set (0.00 sec)

4.DEFAULT句がない場合、ON UPDATE CURRENT_があるTIMESTAMP句、フィールドは自動的に更新され、列はNULLとして認識されます.
timestampフィールドのデフォルトはNULLではありません.NULLを受け入れるフィールドを明確に指定する必要があります.そうしないと、エラーが発生します.
mysql>  CREATE TABLE  tb4( 
    ->         id    INTEGER,
    ->         t1    TIMESTAMP  ON UPDATE CURRENT_TIMESTAMP
    -> );
ERROR 1067 (42000): Invalid default value for 't1'
mysql>  CREATE TABLE  tb4( 
    ->         id    INTEGER,
    ->         t1    TIMESTAMP  NULL ON UPDATE CURRENT_TIMESTAMP
    -> );
Query OK, 0 rows affected (0.23 sec)

mysql> DESC tb4;
+-------+-----------+------+-----+---------+-----------------------------+
| Field | Type      | Null | Key | Default | Extra                       |
+-------+-----------+------+-----+---------+-----------------------------+
| id    | int(11)   | YES  |     | NULL    |                             |
| t1    | timestamp | YES  |     | NULL    | on update CURRENT_TIMESTAMP |
+-------+-----------+------+-----+---------+-----------------------------+
2 rows in set (0.00 sec)


mysql> INSERT tb4(id) values(1);
Query OK, 1 row affected (0.07 sec)

mysql> SELECT * FROM tb4;
+------+------+
| id   | t1   |
+------+------+
|    1 | NULL |
+------+------+
1 row in set (0.00 sec)

mysql> UPDATE tb4 SET id=2 WHERE id=1;
Query OK, 1 row affected (0.11 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM tb4;
+------+---------------------+
| id   | t1                  |
+------+---------------------+
|    2 | 2017-08-30 12:21:13 |
+------+---------------------+
1 row in set (0.00 sec)

5定数をデフォルトに設定
定数DEFAULTがある場合、カラムにはデフォルト値があり、現在のタイムスタンプに自動的に初期化されません.列にON UPDATE CURRENT_がある場合TIMESTAMP句、このタイムスタンプは自動的に更新されます.そうしないと、この列にはデフォルトの定数がありますが、自動的に更新されません.
定数はnull、または1970-01-01 00:00:00から2037-12-31 23:59:59までの値で、他の値はエラーとして報告されます.
デフォルト値を0に設定し、エラーを報告します.
mysql>  CREATE TABLE  tb5( 
    ->         id    INTEGER,
    ->         t1    TIMESTAMP  DEFAULT 0  ON UPDATE CURRENT_TIMESTAMP
    -> );
ERROR 1067 (42000): Invalid default value for 't1'

デフォルト設定は0000-00-00 00 00:00:00、エラー
mysql>  CREATE TABLE  tb5( 
    ->         id    INTEGER,
    ->         t1    TIMESTAMP NULL  DEFAULT '0000-00-00 00:00:00'   ON UPDATE CURRENT_TIMESTAMP
    -> );
ERROR 1067 (42000): Invalid default value for 't1'


デフォルト設定は1970-01-02 00:00:00、正しい
mysql> CREATE TABLE  tb5( 
    ->         id    INTEGER,
    ->         t1    TIMESTAMP NULL  DEFAULT '1970-01-02 00:00:00'   ON UPDATE CURRENT_TIMESTAMP
    -> );
Query OK, 0 rows affected (0.34 sec)

mysql> DESC tb5;
+-------+-----------+------+-----+---------------------+-----------------------------+
| Field | Type      | Null | Key | Default             | Extra                       |
+-------+-----------+------+-----+---------------------+-----------------------------+
| id    | int(11)   | YES  |     | NULL                |                             |
| t1    | timestamp | YES  |     | 1970-01-02 00:00:00 | on update CURRENT_TIMESTAMP |
+-------+-----------+------+-----+---------------------+-----------------------------+
2 rows in set (0.00 sec)

デフォルト値をNULLに設定するには、このフィールドがNULLを受け入れることを明確に指定する必要があります.そうしないと、エラーが発生します.
mysql>  CREATE TABLE  tb5_2( 
    ->         id    INTEGER,
    ->         t1    TIMESTAMP  DEFAULT  NULL   ON UPDATE CURRENT_TIMESTAMP
    -> );
ERROR 1067 (42000): Invalid default value for 't1'
mysql>  CREATE TABLE  tb5_2( 
    ->         id    INTEGER,
    ->         t1    TIMESTAMP  NULL DEFAULT  NULL   ON UPDATE CURRENT_TIMESTAMP
    -> );
Query OK, 0 rows affected (0.36 sec)

mysql> DESC tb5_2
    -> ;
+-------+-----------+------+-----+---------+-----------------------------+
| Field | Type      | Null | Key | Default | Extra                       |
+-------+-----------+------+-----+---------+-----------------------------+
| id    | int(11)   | YES  |     | NULL    |                             |
| t1    | timestamp | YES  |     | NULL    | on update CURRENT_TIMESTAMP |
+-------+-----------+------+-----+---------+-----------------------------+
2 rows in set (0.00 sec)

mysql> DESC tb5_2;
+-------+-----------+------+-----+---------+-----------------------------+
| Field | Type      | Null | Key | Default | Extra                       |
+-------+-----------+------+-----+---------+-----------------------------+
| id    | int(11)   | YES  |     | NULL    |                             |
| t1    | timestamp | YES  |     | NULL    | on update CURRENT_TIMESTAMP |
+-------+-----------+------+-----+---------+-----------------------------+
2 rows in set (0.00 sec)

適用例
mysql> ALTER TABLE news  MODIFY `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
Query OK, 0 rows affected (1.08 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc news;
+------------+------------------+------+-----+-------------------+-----------------------------+
| Field      | Type             | Null | Key | Default           | Extra                       |
+------------+------------------+------+-----+-------------------+-----------------------------+
| id         | int(10) unsigned | NO   | PRI | NULL              | auto_increment              |
| title      | varchar(50)      | NO   |     | NULL              |                             |
| thumb      | varchar(250)     | YES  |     | NULL              |                             |
| content    | text             | YES  |     | NULL              |                             |
| created_at | timestamp        | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| updated_at | timestamp        | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+------------+------------------+------+-----+-------------------+-----------------------------+
6 rows in set (0.00 sec)

mysql> ALTER TABLE `news`  MODIFY `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
Query OK, 0 rows affected (0.08 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc news;
+------------+------------------+------+-----+-------------------+-----------------------------+
| Field      | Type             | Null | Key | Default           | Extra                       |
+------------+------------------+------+-----+-------------------+-----------------------------+
| id         | int(10) unsigned | NO   | PRI | NULL              | auto_increment              |
| title      | varchar(50)      | NO   |     | NULL              |                             |
| thumb      | varchar(250)     | YES  |     | NULL              |                             |
| content    | text             | YES  |     | NULL              |                             |
| created_at | timestamp        | NO   |     | CURRENT_TIMESTAMP |                             |
| updated_at | timestamp        | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+------------+------------------+------+-----+-------------------+-----------------------------+
6 rows in set (0.00 sec)