MySQL Datetime列のデフォルト値をどのように設定しますか?

922
Brian Boatright 2008-10-04 10:24.

MySQL Datetime列のデフォルト値をどのように設定しますか?

SQLServerではそれはgetdate()です。MySQLの同等物は何ですか?それが要因である場合、私はMySQL5.xを使用しています。

25 answers

889
sebthebert 2008-10-04 10:48.

重要な編集:MySQL 5.6.5以降、DATETIMEフィールドでこれを実現できるようになりました。以下の他の投稿をご覧ください...

以前のバージョンでは、DATETIMEではそれを実行できません...

しかし、あなたはタイムスタンプでそれを行うことができます:

mysql> create table test (str varchar(32), ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
Query OK, 0 rows affected (0.00 sec)

mysql> desc test;
+-------+-------------+------+-----+-------------------+-------+
| Field | Type        | Null | Key | Default           | Extra |
+-------+-------------+------+-----+-------------------+-------+
| str   | varchar(32) | YES  |     | NULL              |       | 
| ts    | timestamp   | NO   |     | CURRENT_TIMESTAMP |       | 
+-------+-------------+------+-----+-------------------+-------+
2 rows in set (0.00 sec)

mysql> insert into test (str) values ("demo");
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+------+---------------------+
| str  | ts                  |
+------+---------------------+
| demo | 2008-10-03 22:59:52 | 
+------+---------------------+
1 row in set (0.00 sec)

mysql>

警告: デフォルトでCURRENT_TIMESTAMP ONを使用して列を定義する場合は、常にこの列の値を指定する必要があります。そうしないと、更新時に値が自動的に「now()」にリセットされます。つまり、値を変更したくない場合は、UPDATEステートメントに「[列名] = [列名]」(またはその他の値)を含める必要があります。そうしないと、値は「now()」になります。奇妙な、しかし本当。これがお役に立てば幸いです。5.5.56を使用しています-MariaDB

617
Gustav Bertram 2012-05-16 04:44.

バージョン5.6.5では、日時列にデフォルト値を設定でき、行が更新されたときに更新される列を作成することもできます。タイプ定義:

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

参照: http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available.html

152
Stephan Unrau 2009-09-28 07:04.

MySQL(バージョン5.6.5より前)では、デフォルトのDateTime値に関数を使用することはできません。TIMESTAMPは動作がおかしいため適切ではなく、入力データとしての使用はお勧めしません。(MySQLデータ型のデフォルトを参照してください。)

とはいえ、トリガーを作成することでこれを実現できます。

DateTime型のDateCreatedフィールドを持つテーブルがあります。そのテーブル「BeforeInsert」と「SET NEW.DateCreated=NOW()」にトリガーを作成しましたが、うまく機能します。

これが誰かに役立つことを願っています。

135
John Larson 2011-04-21 04:12.

私にとってはトリガーアプローチが最も効果的でしたが、アプローチに問題があることがわかりました。日付フィールドを挿入時の現在の時刻に設定する基本的なトリガーについて考えてみます。

CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
    FOR EACH ROW SET NEW.dateAdded = NOW();

これは通常は素晴らしいことですが、次のようにINSERTステートメントを使用してフィールドを手動で設定するとします。

INSERT INTO tblMyTable(name, dateAdded) VALUES('Alice', '2010-01-03 04:30:43');

何が起こるかというと、トリガーはフィールドに指定された値をすぐに上書きするため、非現在の時刻を設定する唯一の方法は、フォローアップのUPDATEステートメントです。値が指定されたときにこの動作をオーバーライドするには、IFNULL演算子を使用してこのわずかに変更されたトリガーを試してください。

CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
    FOR EACH ROW SET NEW.dateAdded = IFNULL(NEW.dateAdded, NOW());

これにより、両方の長所が得られます。日付列に値を指定すると、それがかかります。それ以外の場合は、デフォルトで現在の時刻になります。これは、テーブル定義のDEFAULT GETDATE()のようなクリーンなものに比べてまだゲットーですが、近づいています!

31

2つの日時フィールドを持つテーブルでこのalterステートメントを使用してこれを解決することができました。

ALTER TABLE `test_table`
  CHANGE COLUMN `created_dt` `created_dt` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
  CHANGE COLUMN `updated_dt` `updated_dt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

これは、now()関数が機能することを期待するとおりに機能します。nullを挿入するか、created_dtフィールドとupdated_dtフィールドを無視すると、両方のフィールドで完全なタイムスタンプ値が得られます。行を更新すると、updated_dtが変更されます。MySQLクエリブラウザを介してレコードを挿入する場合は、もう1つの手順、つまりcreated_dtを新しいタイムスタンプで処理するためのトリガーが必要でした。

CREATE TRIGGER trig_test_table_insert BEFORE INSERT ON `test_table`
    FOR EACH ROW SET NEW.created_dt = NOW();

トリガーは、命名規則[trig] _ [my_table_name] _ [挿入]と同じように好きなものにすることができます。

25
Donald 2011-02-13 07:44.

トリガーを使用して、このタイプの処理を実行できます。

CREATE TABLE `MyTable` (
`MyTable_ID`  int UNSIGNED NOT NULL AUTO_INCREMENT ,
`MyData`  varchar(10) NOT NULL ,
`CreationDate`  datetime NULL ,
`UpdateDate`  datetime NULL ,
PRIMARY KEY (`MyTable_ID`)
)
;

CREATE TRIGGER `MyTable_INSERT` BEFORE INSERT ON `MyTable`
FOR EACH ROW BEGIN
        -- Set the creation date
    SET new.CreationDate = now();

        -- Set the udpate date
    Set new.UpdateDate = now();
END;

CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON `MyTable`
FOR EACH ROW BEGIN
        -- Set the udpate date
    Set new.UpdateDate = now();
END;
21
Augiwan 2011-06-23 07:32.

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

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

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

私はこれを解決した後、文字通りジャンプしています:D

16
Steven Lloyd 2013-02-22 11:28.

MySQL5.6はこの問題を修正しました。

ALTER TABLE mytable CHANGE mydate datetime NOT NULL DEFAULT 'CURRENT_TIMESTAMP'
15
Saveendra Ekanayake 2016-12-08 04:31.

すでにテーブルを作成している場合は、次を使用できます

デフォルト値を現在の日時に変更するには

ALTER TABLE <TABLE_NAME> 
CHANGE COLUMN <COLUMN_NAME> <COLUMN_NAME> DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;

デフォルト値を「2015-05-1113:01:01」に変更するには

ALTER TABLE <TABLE_NAME> 
CHANGE COLUMN <COLUMN_NAME> <COLUMN_NAME> DATETIME NOT NULL DEFAULT '2015-05-11 13:01:01';
14
Kinjal Dixit 2009-03-11 08:38.

これは確かにひどいニュースです。これは、これに対する長い間保留中のバグ/機能のリクエストです。その議論では、タイムスタンプデータ型の制限についても説明しています。

私は、このことを実装することの問題は何であるかを真剣に考えています。

9
KernelM 2008-10-04 10:30.

now()を使用して日時列の値を設定できますが、これをデフォルト値として使用することはできないことに注意してください。

9
Fabian 2010-08-07 00:13.

解決策としてTIMESTAMP列を使用するすべての人のために、マニュアルから次の制限を2番目にしたいと思います。

http://dev.mysql.com/doc/refman/5.0/en/datetime.html

"TIMESTAMPデータ型の範囲は ' 1970-01-01 00:00 :01'UTCから' 2038-01-19 03:14:07'UTCです。MySQLのバージョンとSQLに応じてさまざまなプロパティがあります。サーバーが実行されているモード。これらのプロパティについては、このセクションの後半で説明します。

したがって、これは明らかに約28年でソフトウェアを破壊します。

データベース側の唯一の解決策は、他の回答で述べられているようなトリガーを使用することだと思います。

9
Evhz 2016-04-03 04:03.

MySql Server 5.7.11を実行していて、次の文を実行しています。

ALTER TABLE table_name CHANGE date_column datetime NOT NULL DEFAULT '0000-00-00 00:00:00'

動作していません。しかし、次のとおりです。

ALTER TABLE table_name CHANGE date_column datetime NOT NULL DEFAULT '1000-01-01 00:00:00'

ただ動作します。

補足として、それはmysqlのドキュメントに記載されています:

DATE型は、日付部分はあるが時間部分はない値に使用されます。MySQLは、DATE値を「YYYY-MM-DD」形式で取得して表示します。サポートされる範囲は「1000-01-01」から「9999-12-31」です。

彼らも言っても:

無効なDATE、DATETIME、またはTIMESTAMP値は、適切なタイプ( '0000-00-00'または '0000-00-00 00:00:00')の「ゼロ」値に変換されます。

8
Drawin Kumar 2011-03-25 22:28.

複数行のトリガーを定義している間、セミコロンがトリガーの終わりとしてMySQLコンパイラによって取得され、エラーが生成されるため、区切り文字を変更する必要があります。例えば

DELIMITER //
CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON `MyTable`
FOR EACH ROW BEGIN
        -- Set the udpate date
    Set new.UpdateDate = now();
END//
DELIMITER ;
5
Samuel 2012-01-14 21:29.

MySQL5.1でそれを行う方法は次のとおりです。

ALTER TABLE `table_name` CHANGE `column_name` `column_name` 
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;

列名を2回入力する必要がある理由がわかりません。

5
George 2011-11-26 17:05.

DATETIMEデフォルトの定義ではこれを行うことはできませんが、次のように挿入ステートメントにselectステートメントを組み込むことができます。

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

表の周りに引用符がないことに注意してください。

MySQL5.5の場合

4
Vijesh VP 2008-10-04 10:31.

デフォルト値をNOW()に設定しようとしている場合、MySQLはそれをサポートしていないと思います。MySQLでは、デフォルトとしてCURRENT_TIMESTAMPを指定できるTIMESTAMPデータ型列を除いて、どのタイプの列のデフォルト値として関数または式を使用することはできません。

3
Deepak N 2018-07-26 22:07.

mysqlは現在の時刻(その挿入の時刻)を与えるnow()と呼ばれる組み込み関数なので、mysqlでは簡単だと思います。

したがって、クエリは同じようになります

CREATE TABLE defaultforTime(
    `creation_time`     DATETIME DEFAULT CURRENT_TIMESTAMP,
    `modification_time` DATETIME default now()
);

ありがとうございました。

2
Fathah Rehman P 2012-12-13 02:39.
CREATE TABLE `testtable` (
    `id` INT(10) NULL DEFAULT NULL,
    `colname` DATETIME NULL DEFAULT '1999-12-12 12:12:12'
)

上記のクエリで「testtable」を作成し、DATETIME列のデフォルト値として「1999-12-1212:12:12」を使用しました colname

1
Rana Aalamgeer 2016-09-20 00:46.

次のコードを使用します

DELIMITER $$ CREATE TRIGGER bu_table1_each BEFORE UPDATE ON table1 FOR EACH ROW BEGIN SET new.datefield = NOW(); END $$

    DELIMITER ;
1
Gvs Akhil 2020-02-17 00:21.

MySQL8.xで正常に動作する

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;
0
Dhrumil Shah 2012-11-16 20:10.

デフォルト値をNOW()として設定しようとしている場合、MySQLは、その列のタイプをDATETIMEではなくTIMESTAMPに変更する必要があることをサポートしています。TIMESTAMPには、デフォルトで現在の日付と時刻があります。問題は解決すると思います。

0
Joseph Persie 2013-10-09 14:13.

たとえば、created_at列とupdate_at列が両方ともDATETIMEであり、デフォルト値nowが必要な「site」という名前のテーブルがある場合、これを実現するために次のSQLを実行できます。

ALTER TABLE `site` CHANGE` created_at`` created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;

ALTER TABLE `site` CHANGE` created_at`` created_at` DATETIME NULL DEFAULT NULL;

ALTER TABLE `site` CHANGE` updated_at`` updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;

ALTER TABLE `site` CHANGE` updated_at`` updated_at` DATETIME NULL DEFAULT NULL;

テーブルには、デフォルト値がCUREENT TIMESTAMPのTIMESTAMPタイプの2つの列を含めることができないため、ステートメントのシーケンスは重要です。

0
Lucas Moyano Angelini 2015-02-20 03:29.

これは私のトリガーの例です:

/************ 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
Bhargav Variya 2020-10-06 05:55.

設定ON UPDATE CURRENT_TIMESTAMPすると、テーブルの行データが更新されるまでに現在の時間がかかります。

 CREATE TABLE bar(
        `create_time` TIMESTAMP CURRENT_TIMESTAMP,
        `update_time` TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    )

Related questions

MORE COOL STUFF

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

グッドジョブ、ESPN

グッドジョブ、ESPN

今日のホワイトハウスの記者会見で、報道官のサラ・ハッカビー・サンダースは、スポーツセンターのホストであるイェメル・ヒルのドナルド・トランプに関する最近のツイートについてコメントするよう求められ、大統領と彼の政策を白人至上主義者として説明した。ヒルは彼女のつぶやきのためにESPNによって公に叱責されました。

アマゾンからのこのレミントンツールセールで髪を整える、スタイルを整える、乾かす、または取り除く

アマゾンからのこのレミントンツールセールで髪を整える、スタイルを整える、乾かす、または取り除く

基本的に頭のあらゆる部分から髪の毛を整えたり、ブロードライしたり、まっすぐにしたり、脱毛したりする必要がある場合は、このレミントンゴールドボックスが最適です。今日だけ、Amazonは、すでに人気のあるShortcut Pro Self-HaircutKitやPearlPro Ceramic Flat Ironのように、グルーミングをはるかに簡単にするヘアツールをマークダウンしています。

カナダの元桂冠詩人が、史上最高の文化の盗用でトゥパックとマヤアンジェロウから盗んだ

カナダの元桂冠詩人が、史上最高の文化の盗用でトゥパックとマヤアンジェロウから盗んだ

トゥパックシャクール(ティムモーゼンフェルダー/ゲッティイメージズ); マヤアンジェロウ(マーティンゴッドウィン/ゲッティイメージズ)移動、テイラースウィフト。ケンドールとカイリーは、必要な数の座席を持っています。

テスラは、ハリケーンイルマによる避難を容易にするために、フロリダでの車両の範囲を拡大しています

テスラは、ハリケーンイルマによる避難を容易にするために、フロリダでの車両の範囲を拡大しています

写真:Tesla Motorsフロリダに住んでいて、Tesla Model S、Model X 60、またはModel 60Dを使用している場合、車の自律性は50 km(約30マイル)高くなります。これは失敗ではなく、ハリケーンイルマによる避難作業を容易にするために会社自身が命じた自治権の一時的な延長です。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

投資ノート:Bioscout AU$300万シード

投資ノート:Bioscout AU$300万シード

Bioscoutは、農家を運転席に置くという使命を負っています。Artesian(GrainInnovate)やUniseedと並んで、最新のシードラウンドでチームを支援できることをうれしく思います。問題真菌症による重大な作物の損失は、農民にとって試練であることが証明されています。

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

遠隔医療は、パンデミック後の時代では新しいものではなく、時代遅れの分野でもありません。しかし、業界を詳しく見ると、需要と供給の強力な持続可能性と、米国で絶え間ない革命となる強力な潜在的成長曲線を示しています。

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

2021年は、世界的なベンチャーキャピタル(VC)の資金調達にとって記録的な年でした。DealStreetAsiaによると、東南アジアも例外ではなく、この地域では年間で記録的な25の新しいユニコーンが採掘されました。

ムーアの法則を超えて

ムーアの法則を超えて

計算に対する私たちの欲求とムーアの法則が提供できるものとの間には、指数関数的に増大するギャップがあります。私たちの文明は計算に基づいています—建築と想像力の現在の限界を超える技術を見つけなければなりません。

Language