web-dev-qa-db-ja.com

datetimeデータ型のデフォルト値としてNOW()を設定しますか?

テーブルusersには、datetimeデータ型からなるregisterDate and lastVisitDateという2つの列があります。私は以下のことをやりたいと思います。

  1. RegisterDateのデフォルト値をMySQL NOW()に設定します。
  2. LastVisitDateのデフォルト値を、デフォルトで使用するnullではなく0000-00-00 00:00:00に設定します。

テーブルは既に存在し、既存のレコードを持っているので、Modify tableを使用したいと思います。以下の2つのコードを使用してみましたが、どちらもうまくいきません。

ALTER TABLE users MODIFY registerDate datetime DEFAULT NOW()
ALTER TABLE users MODIFY registerDate datetime DEFAULT CURRENT_TIMESTAMP;

それは私にエラーを与えます:ERROR 1067 (42000): Invalid default value for 'registerDate'

MySQLでデフォルトのdatetime値をNOW()に設定することは可能ですか?

184

MySQL 5.6.5以降では、動的デフォルト値でDATETIME型を使用できます。

CREATE TABLE foo (
    creation_time      DATETIME DEFAULT   CURRENT_TIMESTAMP,
    modification_time  DATETIME ON UPDATE CURRENT_TIMESTAMP
)

あるいは両方のルールを組み合わせることもできます。

modification_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

参照:
http://dev.mysql.com/doc/refman/5.7/ja/timestamp-initialization.html
http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available.html

5.6.5より前では、レコードが変更されるたびに自動的に更新されるTIMESTAMPデータ型を使用する必要があります。しかし残念ながら、1つのテーブルには自動更新されるTIMESTAMPフィールドは1つしか存在できません。

CREATE TABLE mytable (
  mydate TIMESTAMP
)

参照してください。 http://dev.mysql.com/doc/refman/5.1/en/create-table.html

MySQLがUPDATEのタイムスタンプ値を更新しないようにしたい場合(そのため、INSERTでのみトリガーされるように)、定義を次のように変更できます。

CREATE TABLE mytable (
  mydate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
227
Johan

回避策としてトリガーを使用して、新規挿入に対してdatetimeフィールドをNOW()に設定します。

CREATE TRIGGER `triggername` BEFORE INSERT ON  `tablename` 
FOR EACH ROW 
SET NEW.datetimefield = NOW()

アップデートにも使えるはずです

Johan&Leonardoによる回答には、タイムスタンプフィールドへの変換が含まれます。質問で提示されたユースケース(RegisterDateとLastVisitDateの格納)ではおそらくこれで問題ありませんが、これは普遍的な解決策ではありません。 datetime vs timestamp の質問を参照してください。

70
wardk

私の解決策

ALTER TABLE `table_name` MODIFY COLUMN `column_name` TIMESTAMP NOT
NULL DEFAULT CURRENT_TIMESTAMP;
42
Leonardo

EUREKA !!!


MySQLのデフォルトのDATETIME値を設定しようとして心を失ったすべての人のために、私はまさにあなたがどのように感じるか感じたか知っています。だからここにあります:

`ALTER TABLE  `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0

を囲む一重引用符/二重引用符は付けていませんであることに注意してください。


重要な更新

この回答はさかのぼって投稿されました。当時、それは私の(おそらく最新の)MySQLのインストールに取り組んでいましたが、私はそれを共有したいと思いました。あなたが今この解決策を使うことに決める前に以下のコメントを読んでください。

13
Augiwan

mysql 5.6のドキュメントでは、CURRENT_TIMESTAMPはTIMESTAMPとDATETIMEの両方のデータ型のデフォルトとして使用できると述べています。

http://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html

4
Jean Rajotte

バージョンmysql 5.6.5以降では、正確な日時を使用してデフォルト値を設定することもできます。微妙なビットがあります、それはdatetimeとNOW()関数呼び出しの両方に精度値を渡すことです。

この例はうまくいきます:

    ALTER TABLE my_table MODIFY created datetime(6) NOT NULL DEFAULT NOW(6);

この例は機能しません。

    ALTER TABLE my_table MODIFY created datetime(6) NOT NULL DEFAULT NOW();
3
Matteius

最善の方法は "DEFAULT 0"を使うことです。他の方法:

    /************ ROLE ************/
    drop table if exists `role`;
    create table `role` (
        `id_role` bigint(20) unsigned not null auto_increment,
        `date_created` datetime,
        `date_deleted` datetime,
        `name` varchar(35) not null,
        `description` text,
        primary key (`id_role`)
    ) comment='';

    drop trigger if exists `role_date_created`;
    create trigger `role_date_created` before insert
        on `role`
        for each row 
        set new.`date_created` = now();
`ALTER TABLE  `table_name` CHANGE `column_name` 
    timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
    ON UPDATE CURRENT_TIMESTAMP

更新時にタイムスタンプを更新するために使用できます。

1
veelen
ALTER TABLE table_name
  CHANGE COLUMN date_column_name date_column_name DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;

最後に、これは私のために働いた!

0
Eagle_Eye

MySQLを使って、これは私のために働きました:

ALTER TABLE `table_name` MODIFY `column_name` datetime NOT NULL DEFAULT NOW();
0
rosshump