■ はじめに
テーブルには、よく作成日時、更新日時を付けることが多いが
それらに付与する「自動初期化」および「更新機能」があるので取り上げる
また、使用する際の注意点を記す。
■ 構文(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_at | updated_at |
00001 | 2017-09-28 22:31:50 | 2017-09-28 22:31:50 |
-- [2-1] 更新処理
`value | `created_at | updated_at |
00002 | 2017-09-28 22:31:50 | 2017-09-28 22:31:52 |
-- [2-2] 更新処理(変更なし)
※ 値が変わらないと、更新日時も更新されない
`value | `created_at | updated_at |
00002 | 2017-09-28 22:31:50 | 2017-09-28 22:31:52 |
-- [2-3] 更新処理(変更なし。更新日時に値を設定する)
`value | `created_at | updated_at |
00002 | 2017-09-28 22:31:50 | 1978-11-11 00:00:00 |
-- [2-4] 更新処理(変更なし。更新日時に値を設定する)
`value | `created_at | updated_at |
00002 | 2017-09-28 22:31:50 | 2017-09-28 22:31:59 |
参考文献
公式サイト
https://dev.mysql.com/doc/refman/5.6/ja/timestamp-initialization.html