MySQLメモ019:TIMESTAMP型の列には勝手にNOT NULL制約とDEFAULT制約が付く
MySQLではTIMESTAMP型の列にNULL制約かNOT NULL制約を付けないと自動的にNOT NULL制約が付く。これには驚いた。どういう理由でこういうことになってるんだろう。
例えば、以下のようなテーブルを作る。
CREATE TABLE tbl1 ( id INT, dt1 TIMESTAMP, dt2 TIMESTAMP ) ENGINE=InnoDB
そして以下のINSERT文を実行する。
INSERT INTO tbl1 (id) VALUES (1)
そうすると作成されたレコードのdt1,dt2はともにNULLだろうと、MySQL初心者の自分は思った。
しかし実際、そのレコードは以下のようになっている。入れた覚えのない値がdt1、dt2に入っている。
id | dt1 | dt2 |
---|---|---|
1 | 2015-02-12 22:47:32 | 0000-00-00 00:00:00 |
"SHOW CREATE TABLE tbl1" としてみると、結果は以下のようになる。
CREATE TABLE `tbl1` ( `id` int(11) DEFAULT NULL, `dt1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `dt2` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ) ENGINE=InnoDB DEFAULT CHARSET=utf8
dt1、dt2ともにNOT NULL制約が付いていて、さらにdt1はCURRENT_TIMESTAMP、dt2には意味不明なデフォルト値が設定される。
これは親切のつもりなんだろうか?BIGなお世話だ。それとも正当な理由があるんだろうか?そもそもdt2のデフォルト値の"0000-00-00"ってなんだ?西暦は1年から、元号も元年(1年)からで、「0年0月0日」なんて聞いたことがない。
MySQLではTIMESTAMP型の列ではNULLを許す場合、次のように明示的にNULL制約(?)を書いてやらないといけないようだ。そうでないと、上記のように勝手にNOT NULL制約とデフォルト値が付けられる。
CREATE TABLE tbl1 ( id INT, dt1 TIMESTAMP NULL, dt2 TIMESTAMP NULL ) ENGINE=InnoDB;
"SHOW CREATE TABLE tbl1" の結果は以下のようになる。
CREATE TABLE `tbl1` ( `id` int(11) DEFAULT NULL, `dt1` timestamp NULL DEFAULT NULL, `dt2` timestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8
« MySQLメモ018:MySQL WorkbenchでTRUNCATEできるようにする | Main | MySQLメモ020:INSERT後にAUTO_INCREMENTなカラムの値を取得する方法(PDO編) »
「MySQL」カテゴリの記事
- MySQLメモ020:INSERT後にAUTO_INCREMENTなカラムの値を取得する方法(PDO編)(2015.02.14)
- MySQLメモ019:TIMESTAMP型の列には勝手にNOT NULL制約とDEFAULT制約が付く(2015.02.12)
- MySQLメモ018:MySQL WorkbenchでTRUNCATEできるようにする(2015.02.11)
- MySQLメモ017:CREATE文、AUTO_INCREMENT、ENGINE(2015.02.08)
- SQLインジェクション その7(2013.10.14)
The comments to this entry are closed.
TrackBack
Listed below are links to weblogs that reference MySQLメモ019:TIMESTAMP型の列には勝手にNOT NULL制約とDEFAULT制約が付く:
« MySQLメモ018:MySQL WorkbenchでTRUNCATEできるようにする | Main | MySQLメモ020:INSERT後にAUTO_INCREMENTなカラムの値を取得する方法(PDO編) »
Comments