My Photo

« MySQLメモ018:MySQL WorkbenchでTRUNCATEできるようにする | Main | MySQLメモ020:INSERT後にAUTO_INCREMENTなカラムの値を取得する方法(PDO編) »

February 12, 2015

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に入っている。

iddt1dt2
12015-02-12 22:47:320000-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

参考ページ:
SQLのTIMESTAMP型と日付「0000-00-00」 - ディノオープンラボラトリ

« MySQLメモ018:MySQL WorkbenchでTRUNCATEできるようにする | Main | MySQLメモ020:INSERT後にAUTO_INCREMENTなカラムの値を取得する方法(PDO編) »

MySQL」カテゴリの記事

Comments

The comments to this entry are closed.

TrackBack

« MySQLメモ018:MySQL WorkbenchでTRUNCATEできるようにする | Main | MySQLメモ020:INSERT後にAUTO_INCREMENTなカラムの値を取得する方法(PDO編) »

June 2021
Sun Mon Tue Wed Thu Fri Sat
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30      
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof