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


197

テーブルユーザーに2つの列があります。つまりregisterDate and lastVisitDate、日時データ型で構成されています。次のことを行いたいと思います。

  1. registerDateのデフォルト値をMySQL NOW()に設定します
  2. lastVisitDateのデフォルト値を0000-00-00 00:00:00、デフォルトで使用するnullの代わりに設定します。

テーブルが既に存在し、既存のレコードがあるため、テーブルの変更を使用したいと思います。以下の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でデフォルトの日時値をNOW()に設定することは可能ですか?


4
ALTER TABLE users MODIFY dateTime timestamp default CURRENT_TIMESTAMPdata type両方の取り組みでフィールドの定義をしていませんでした
Shakti Singh

3
MySQLの5.6以来DATE、デフォルト値で動作するはずですNOW()
AbcAeffchen

このmysql 5.6ドキュメント:dev.mysql.com/doc/refman/5.6/en/data-type-defaults.htmlによると、デフォルトとしてCURRENT_TIMESTAMP()を使用できます。
blacktie24 2014年

CURRENT_TIMESTAMP + 1 DAYを実装するにはどうすればよいですか
Ilker Baltaci 2017年

回答:


241

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/en/timestamp-initialization.html
http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available .html

5.6.5より前のバージョンでTIMESTAMPは、レコードが変更されるたびに自動的に更新されるデータ型を使用する必要があります。ただし、残念ながら、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
)

80
私は本当にタイムスタンプを使いたくありません。
Ibrahim Azhar Armar

2
@イブラヒム:タイムスタンプが唯一のチャンスです。日時フィールドを使用する場合は、毎回now()を使用してレコードを挿入する必要があります。
Nicola Cossu、2011

9
マニュアルは明確に語っています:「これは、たとえば、日付列のデフォルトをNOW()やCURRENT_DATEなどの関数の値に設定できないことを意味します」。
Nicola Cossu

19
@Johan DATETIMEは、保持できる範囲を実行することがよくありますTIMESTAMPS。 00:01 'UTCから' 2038-01-19 03:14:07 'UTC。生年月日、またはたとえば30年以上先のものを保存するため。
user17753

5
@nickrulez timestampMySQL 5.6以降、この動作に制限されなくなりました
Dan Esparza 2015

70

新しい挿入の日時フィールドをNOW()に設定するための回避策としてトリガーを使用します。

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

更新にも有効です

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


4
これは受け入れられる答えであるはずですが、具体的には日付時刻フィールドであることを明確にするために編集する必要があります。元の投稿者は、日時フィールドに対してそれを解決する方法を知りたがっていて、use a timestampこれら2つのデータ型の違いを本当に理解しているのであれば、ばかげた回避策です。
phpguru

45

私の解決策

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

このdefは機能します。SQLYogまたはそのようなツールを使用することをすべてのユーザーに推奨します。これにより、簡単なインターフェイスでこれを行うことができます。
不変のブリック

27
これはまだTIMESTAMPカラムの解決策です。誰も求めていなかったTIMESTAMP...
Petr Peller 2014年

2
はい、これは質問に対する答えではありません。TIMESTAMPは、DATETIMEとは異なるタイプのフィールドです。
John Hunt

@Leonardoどうすれば日付のみを表示できますか
151291

13

EUREKA !!!


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

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

0の前後に一重引用符/二重引用符を追加していないこと注意してください。


重要な更新

この回答はずっと前に投稿されました。当時、それはMySQLの(おそらく最新の)インストールで機能し、共有したいと思っていました。このソリューションを今すぐ使用する前に、以下のコメントをお読みください。


16
それは期待に依存します...-このソリューションでは、デフォルトが提供されているため、フィールドをNULLにすることができます。-このソリューションでは、フィールドをNOW()に設定しません。
CodeReaper

10
これは元の質問には答えません。答えはそれを明確に述べるべきです。
Matt Browne 2013

2
TRADITIONAL SQLモードにはNO_ZERO_DATEが含まれているため、上記の場合は機能しません。
MOZ

提供された回答に基づいて、DATETIMEをTIMESTAMPに犠牲にしない場合は、トリガーを使用する必要があるように聞こえます。
クリス

1
このソリューションは、「OMGはゼロの日付です!なんてこった!これをjava.lang.Date/System.DateTime!OMG!-crashes-」に変換することはできません。
フェリペ


4

mysql 5.6.5以降のバージョンでは、正確な日時を使用し、デフォルト値を設定することもできます。ただし、微妙なビットがあります。これは、日時値と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();

1
`ALTER TABLE  `table_name` CHANGE `column_name` 
    timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
    ON UPDATE CURRENT_TIMESTAMP

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


1

最良の方法は、「デフォルト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();

0

これはMySQLを使用して私にとってはうまくいきました:

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

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

最後に、これでうまくいきました!


0
CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `dateCreated` datetime DEFAULT CURRENT_TIMESTAMP,
  `dateUpdated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `mobile_UNIQUE` (`mobile`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

-1

これがまだアクティブかどうかはわかりませんが、ここに行きます。

デフォルトをNow()に設定することに関しては、DATETIMEデータ型でそれが可能であるとは思いません。そのデータ型を使用する場合は、次のように挿入を実行するときに日付を設定します。

INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))

mySQLのバージョンは5.5です


7
:ように簡略化することができるINSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', NOW())
user17753

-1

これは私にとってはうまくいきました-テーブルのINSERTをUPDATEに変更しただけです。

INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.