8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

MySQLのtimestampのデータが勝手に更新されてる

Last updated at Posted at 2020-01-21

現象

> 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

原因

結論、createdCURRENT_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'
8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?