【MySQL】MySQLの日時に関する自動初期化および更新機能

■ はじめに

 テーブルには、よく作成日時、更新日時を付けることが多いが
それらに付与する「自動初期化」および「更新機能」があるので取り上げる

 また、使用する際の注意点を記す。 

■ 構文(CREATE TABLE)

・・・略・・・
【作成日時】 DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '作成日時',
【更新日時】 DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新日時'
・・・略・・・

■ 使用上の注意

 * 値が変わらないと、更新日時も更新されない(以下の「サンプル」の「[2-2] 更新処理(変更なし)」を参照)

■ サンプル

CREATE TABLE

CREATE TABLE `sample` (
  `value` VARCHAR(5) NOT NULL,
  `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '作成日時',
  `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新日時'
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;

更新処理(実験として)

-- [1] 追加処理
INSERT INTO sample(value) VALUES ('00001');

SELECT * FROM sample;

SELECT SLEEP(2);

-- [2-1] 更新処理
UPDATE sample SET value='00002' WHERE value='00001';

SELECT * FROM sample;

SELECT SLEEP(2);

-- [2-2] 更新処理(変更なし)
UPDATE sample SET value='00002' WHERE value='00002';

SELECT * FROM sample;

SELECT SLEEP(2);

-- [2-3] 更新処理(変更なし。更新日時に値を設定する)
UPDATE sample SET value='00002', updated_at='1978-11-11 00:00:00' WHERE value='00002';

SELECT * FROM sample;

SELECT SLEEP(2);

-- [2-4] 更新処理(変更なし。更新日時に値を設定する)
UPDATE sample SET value='00002', updated_at=CURRENT_TIMESTAMP WHERE value='00002';

SELECT * FROM sample;
出力結果
-- [1] 追加処理
`value`created_atupdated_at
000012017-09-28 22:31:502017-09-28 22:31:50

-- [2-1] 更新処理
`value`created_atupdated_at
000022017-09-28 22:31:502017-09-28 22:31:52

-- [2-2] 更新処理(変更なし)

※ 値が変わらないと、更新日時も更新されない
`value`created_atupdated_at
000022017-09-28 22:31:502017-09-28 22:31:52

-- [2-3] 更新処理(変更なし。更新日時に値を設定する)
`value`created_atupdated_at
000022017-09-28 22:31:501978-11-11 00:00:00

-- [2-4] 更新処理(変更なし。更新日時に値を設定する)
`value`created_atupdated_at
000022017-09-28 22:31:502017-09-28 22:31:59

参考文献

公式サイト

https://dev.mysql.com/doc/refman/5.6/ja/timestamp-initialization.html