web-dev-qa-db-ja.com

MySQL 5.5では日付をCURRENT_TIMESTAMPにデフォルト設定できません

Current_timestampをデフォルト値として設定できません。私のMysqlバージョンは5.5.47です。

クエリは

ALTER TABLE `downloads` ADD `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ;

enter image description here

ローカルデータベースでmysql V5.6.56を使用すると問題なく動作します。

21
urfusion

MySQL 5.5マニュアル から:

日付列のデフォルトをNOW()やCURRENT_DATEなどの関数の値に設定することはできません。例外は、CURRENT_TIMESTAMPをTIMESTAMP列のデフォルトとして指定できることです。

したがって、TIMESTAMP列の代わりにDATE列を追加すると、MySQL 5.5で達成したいことが機能します。

機能を可能にする5.6.xでの変更は文書化されています here 、そして完全性のために関連する要約を引用します:

MySQL 5.6.5以降、TIMESTAMPおよびDATETIMEカラムは自動的に初期化され、現在の日時(つまり、現在のタイムスタンプ)に更新されます。 5.6.5より前では、これはTIMESTAMPにのみ当てはまり、テーブルごとに最大で1つのTIMESTAMP列に当てはまります。

26
Philᵀᴹ

チェック この答え

オプションは次のとおりです。

  • MySQL 5.6.5にアップグレード
  • 次のように、列タイプをTIMESTAMPに変更します。

    ALTER TABLE `downloads` ADD `date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ;
    
  • 列を自動的に更新するトリガーを作成します。

    ALTER TABLE `downloads` ADD `date` DATETIME NULL; -- date must allow
                                                      -- NULLs or default
                                                      -- to a special value
    DROP TRIGGER IF EXISTS downloads_BI;
    DELIMITER //
    CREATE TRIGGER downloads_BI
    BEFORE INSERT ON downloads FOR EACH ROW
    BEGIN
        IF (NEW.date IS NULL) THEN -- change the isnull check for the default used
            SET NEW.date = now();
        END IF;
    END//
    DELIMITER ;
    

    更新時に自動的に更新する必要がある場合、またはnull値を防止したい場合は、更新値も作成できます。

    mysql> INSERT INTO downloads (i) VALUES (1); -- I do not set date
    Query OK, 1 row affected (0.00 sec)
    
    mysql> SELECT * FROM downloads;
    +------+---------------------+
    | i    | date                |
    +------+---------------------+
    |    1 | 2016-03-22 09:27:52 |
    +------+---------------------+
    1 row in set (0.00 sec)
    
9
jynus