MySQL で TIMESTAMP をデフォルト値として持つテーブル作成する時、
2つ以上の TIMESTAMP で、デフォルト値をセットしようとするとダメである。
でも、以下は、古いMySQLの話、、、
MySQL5.7 以上なら、、
MySQL 複数のTIMESTAMP DEFAULT CURRENT_TIMESTAMP - Oboe吹きプログラマの黙示録
ーーーーーーーーーーーーーーーー
例)
DELIMITER //
DROP TABLE IF EXISTS pointinfo;
//
CREATE TABLE pointinfo (
id INT NOT NULL AUTO_INCREMENT
, point INT NOT NULL
, created_at TIMESTAMP NOT NULL
DEFAULT CURRENT_TIMESTAMP
, update_at TIMESTAMP NOT NULL
DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
, PRIMARY KEY (id) )
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_bin ;
//
DELIMITER ;
これは、以下のエラーが発生する。
Error Code: 1293. Incorrect table definition; there can be only one TIMESTAMP column
with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause 0.000 sec
が、発生する。
デフォルトで、CURRENT_TIMESTAMP をセットする TIMESTAMP の存在は、1つしか許されない。
そこで、TIMESTAMP 型は、NOT NULL 制約に対して NULL を挿入する場合、強制的に現在時刻で挿入される
ことを利用して、
DELIMITER //
DROP TABLE IF EXISTS pointinfo ;
//
CREATE TABLE pointinfo (
id INT NOT NULL AUTO_INCREMENT
, point INT NOT NULL
, created_at TIMESTAMP NOT NULL DEFAULT 0
, update_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
, PRIMARY KEY (id) )
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_bin ;
//
DELIMITER ;
データ作成、、
INSERT INTO pointinfo ( point, created_at )
VALUES (12, null), (13, null), (14, null), (15, null);
のように、insert で NULL を指定する約束にする。
INSERT INTO pointinfo ( point )
VALUES (30); -- created_at は、 '0000-00-00 00:00:00' が入ってしまう。