データベースサーバの移行に際して起こったトラブル.
MySQLにて,データ挿入時に自動でタイムスタンプを付与したい…
> CREATE TABLE `my_table` (
> `insert_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP PRIMARY KEY,
> `my_column1` VARCHAR(4) NOT NULL,
> `my_column2` VARCHAR(4) NOT NULL,
> `my_column3` VARCHAR(4) NOT NULL);
こんなテーブルを作った.
insert_time
はNULLを許容しないが,もしNULLを入れても自動で現在時刻に差し替えてくれるはず…!
データを挿入してみる.
> INSERT INTO my_table VALUES (null, "aaaa", "iiii", "uuuu");
しかし…
Column 'insert_time' cannot be null.
移行前のサーバではこれで動いてたはずなのに…
解決策
その1:insert_time
を指定しないようにする
> INSERT INTO my_table (my_column1, my_column2, my_column3) VALUES ("aaaa", "iiii", "uuuu");
めんどい…
その2:null
ではなくdefault
を指定する
> INSERT INTO my_table VALUES (default, "aaaa", "iiii", "uuuu");
なるほど,null
で指定してしまってたからいけなかったのか.
null
はdefault
に置き換わるわけではなかったのね!
デフォルト値を使いたいなら
- 何も指定しない
-
default
を指定する
のいずれかが必要だということだ.
しかし,移行前のサーバではなぜエラーを吐かなかったのか?
## 勘違いの原因
移行前のサーバを調べ直したところ,insert_time
の型がdatetime
じゃなくてtimestamp
だったのだ!
timestamp
型なら,
> INSERT INTO my_table VALUES (null, "aaaa", "iiii", "uuuu");
も問題なく通る.
Q. じゃあtimestamp
型を使うべきか?
A. datetime
を使うべき
timestamp
の方がdatetime
よりも使い勝手が悪いみたい.
一番分かりやすいのは,datetime
は「9999年」まで指定できるのに対して,
timestamp
は「2038年」までしか指定できないということ.
2038年なんてそんなに遠い未来じゃないから,どうしてもtimestamp
を使わざるをえないような人以外は,datetime
使えばいいよね.
他にもいろいろ違うっぽい.
(参考:MySQLのDATETIME型とTIMESTAMP型の違いを検証してみた)
結論
原因も知れたしスッキリした!