MySQL日時列のデフォルト値をどのように設定しますか?
SQL Serverではgetdate()
です。MySQLに相当するものは何ですか?それが要因である場合、私はMySQL 5.xを使用しています。
MySQL日時列のデフォルト値をどのように設定しますか?
SQL Serverではgetdate()
です。MySQLに相当するものは何ですか?それが要因である場合、私はMySQL 5.xを使用しています。
回答:
重要な編集: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ステートメントに "[your column name] = [your column name]"(またはその他の値)を含める必要があります。そうしないと、値は "now()"になります。奇妙ですが、本当です。これがお役に立てば幸いです。5.5.56-MariaDBを使用しています**
DATE
列のデフォルト値を設定することは可能ですか?(datetime
列ではありません)。
バージョン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
dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
MySQL(バージョン5.6.5より前)では、デフォルトのDateTime値に関数を使用できません。TIMESTAMPは奇妙な動作をするため適切ではなく、入力データとしての使用は推奨されません。(MySQLデータタイプのデフォルトを参照してください。)
つまり、トリガーを作成することでこれを実現できます。
DateTime型のDateCreatedフィールドを持つテーブルがあります。そのテーブルに「挿入前」と「SET NEW.DateCreated=NOW()
」のトリガーを作成しました。
これが誰かの役に立つことを願っています。
IF NEW.created_at IS NOT NULL
私にとってはトリガーアプローチが最も効果的でしたが、そのアプローチには問題が見つかりました。挿入時に日付フィールドを現在時刻に設定するための基本的なトリガーを検討してください。
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()のようなクリーンなものに比べてゲットーですが、近づいています!
NULL
。警告はもうありません。
dateAdded
「0000-00-00 00:00:00」がすべて表示されます。これを使用するとうまくいきます: `FOR EACH ROW IF NEW.dateAdded = 0 THEN SET NEW.dateAdded = NOW(); 終了IF; `
2つの日時フィールドを持つテーブルでこの変更ステートメントを使用して、これを解決することができました。
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] _ [insert]を好きなように設定できます
トリガーを使用してこの種のことを行うことができます。
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;
MySQLでデフォルトのDATETIME値を設定しようと心を失ったすべての人にとって、私はあなたがどのように感じ/感じたかを正確に知っています。だからここにあります:
ALTER TABLE `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0
0の前後に一重引用符/二重引用符を追加していないことに注意してください
これを解決した後、私は文字通りジャンプしています:D
ALTER TABLE zones MODIFY created datetime NOT NULL DEFAULT 0;
ALTER TABLE mytable CHANGE mydate datetime NOT NULL DEFAULT 'CURRENT_TIMESTAMP'
すでにテーブルを作成している場合は、使用できます
デフォルト値を現在の日時に変更するには
ALTER TABLE <TABLE_NAME>
CHANGE COLUMN <COLUMN_NAME> <COLUMN_NAME> DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
デフォルト値を「2015-05-11 13:01:01」に変更するには
ALTER TABLE <TABLE_NAME>
CHANGE COLUMN <COLUMN_NAME> <COLUMN_NAME> DATETIME NOT NULL DEFAULT '2015-05-11 13:01:01';
これは確かに恐ろしいニュースです。これは、これに対する長い保留中のバグ/機能リクエストです。その説明では、タイムスタンプデータ型の制限についても説明しています。
私はこれを実装する際の問題は何なのかを真剣に考えています。
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」)の「ゼロ」値に変換されます。
now()を使用して日時列の値を設定できますが、それをデフォルト値として使用できないことに注意してください。
NOW()
後で挿入に使用します。バージョン5.6の場合は、単にNOW()
デフォルト値として設定します。
解決策として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年後にソフトウェアを破壊します。
データベース側での唯一の解決策は、他の回答で述べられているようなトリガーを使用することだと思います。
複数行トリガーを定義している間、MySQLコンパイラーがセミコロンをトリガーの終わりとして受け取り、エラーを生成するため、区切り文字を変更する必要があります。例えば
DELIMITER //
CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON `MyTable`
FOR EACH ROW BEGIN
-- Set the udpate date
Set new.UpdateDate = now();
END//
DELIMITER ;
CREATE TABLE `testtable` (
`id` INT(10) NULL DEFAULT NULL,
`colname` DATETIME NULL DEFAULT '1999-12-12 12:12:12'
)
上記のクエリで「testtable」を作成するために、DATETIME列のデフォルト値として「1999-12-12 12:12:12」を使用しました colname
次のコードを使用します
DELIMITER $$
CREATE TRIGGER bu_table1_each BEFORE UPDATE ON table1 FOR EACH ROW
BEGIN
SET new.datefield = NOW();
END $$
DELIMITER ;
たとえば、create_at列とupdate_at列があり、両方ともDATETIMEであり、現在のデフォルト値が必要な「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つの列を含めることができないため、ステートメントのシーケンスは重要です。
これは私のトリガーの例です:
/************ 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();
MySQL 8.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;
デフォルトのタイムスタンプを解決できます。まず、使用している文字セットを検討してください。たとえば、utf8を使用した場合、この文字セットはすべての言語をサポートし、laten1を使用した場合、この文字セットは英語のみをサポートします。次のsetp任意のプロジェクトで作業している場合は、クライアントのタイムゾーンを把握し、自分がクライアントゾーンであることを選択する必要があります。このステップは必須です。