現象
> update users set status = 9, modified = now() where id = 1;
上記を叩いてきちんと更新されているか確認してみると、modified
だけではなくcreated
まで更新されてしまった。。
-- 元々のデータ
> select * from users;
*************************** 1. row ***************************
user_id: 1
status: 1
created: 2015-05-26 04:01:21
modified: 2018-03-03 05:54:54
-- 更新したデータ
> select * from users;
*************************** 1. row ***************************
user_id: 1
status: 9
created: 2020-01-21 00:00:00 -- あれ、こっちまで更新されてる。。
modified: 2020-01-21 00:00:00
原因
結論、created
がCURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
で設定されているからでした。
> show create table users\G
*************************** 1. row ***************************
Table: users
Create Table: CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`status` tinyint(4) NOT NULL,
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
があるとupdate文をかけた時に自動更新されるような設定なため、勝手にcreated
も更新されていたようです。
timestamp型は、デフォルトでCURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
が付いてしまうらしい?
無効化
下のsqlを叩いて自動更新を無効化しました。
> alter table users modify created timestamp default '1970-01-01 00:00:01'