MySQL Datetime カラムのデフォルト値をどのように設定しますか?
SQL Server では、getdate(). MySQLの同等物は何ですか? それが要因である場合、私はMySQL 5.xを使用しています。
重要な編集: MySQL 5.6.5 以降の DATETIME フィールドでこれを実現できるようになりました。以下の他の投稿をご覧ください...
以前のバージョンでは、DATETIME でそれを行うことはできません...
しかし、あなたは TIMESTAMP でそれを行うことができます:
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 を使用しています
バージョン 5.6.5 では、datetime 列にデフォルト値を設定でき、行が更新されたときに更新される列を作成することもできます。タイプ定義:
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
MySQL (バージョン 5.6.5 より前) では、デフォルトの DateTime 値に関数を使用できません。TIMESTAMP は動作がおかしいため適切ではなく、入力データとして使用することはお勧めしません。( MySQL データ型のデフォルトを参照してください。)
つまり、 Trigger を作成することでこれを実現できます。
DateTime 型の DateCreated フィールドを持つテーブルがあります。そのテーブル「挿入前」と「」にトリガーを作成しましたが、SET NEW.DateCreated=NOW()うまく機能します。
これが誰かに役立つことを願っています。
私にとっては、トリガー アプローチが最も効果的でしたが、このアプローチには問題がありました。挿入時に日付フィールドを現在の時刻に設定する基本的なトリガーを考えてみましょう。
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() のようなクリーンなものと比べると、まだゲットーですが、近づいています。
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]_[insert] という命名規則が好きです
MySQLでデフォルトのDATETIME値を設定しようとして落胆したすべての人にとって、私はあなたがどのように感じているかを正確に知っています. だからここにあります:
ALTER TABLE `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0
0の前後に一重引用符/二重引用符を追加していないことを注意深く観察してください。
私はこれを解決した後、文字通りジャンプしています:D
トリガーを使用して、この種のことを行うことができます。
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;
すでにテーブルを作成している場合は、使用できます
デフォルト値を現在の日時に変更するには
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';
ALTER TABLE mytable CHANGE mydate datetime NOT NULL DEFAULT 'CURRENT_TIMESTAMP'
これは実に恐ろしいニュースです。これは、これに対する長い保留中のバグ/機能リクエストです。その議論では、タイムスタンプ データ型の制限についても説明しています。
このことを実装する際の問題は何なのか、真剣に考えています。
私は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() を使用して datetime 列の値を設定できますが、それをデフォルト値として使用できないことに注意してください。
解決策として 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 ;
デフォルトの定義ではこれを行うことはできませんがDATETIME、次のように挿入ステートメントにselectステートメントを組み込むことができます。
INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))
表の周りに引用符がないことに注意してください。
MySQL5.5の場合
デフォルト値を NOW() に設定しようとしている場合、MySQL はそれをサポートしていないと思います。MySQL では、デフォルトとして CURRENT_TIMESTAMP を指定できる TIMESTAMP データ型カラムを除いて、どのタイプのカラムのデフォルト値としても関数または式を使用できません。
MySQL 5.1 で行う方法は次のとおりです。
ALTER TABLE `table_name` CHANGE `column_name` `column_name`
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
列名を 2 回入力する必要がある理由がわかりません。
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
これは私のトリガーの例です:
/************ 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();
デフォルト値を NOW() に設定しようとしている場合、MySQL は、その列の型を DATETIME ではなく TIMESTAMP に変更する必要があることをサポートしています。TIMESTAMP にはデフォルトとして現在の日付と時刻があります..問題が解決すると思います..
たとえば、「site」という名前のテーブルがあり、created_at 列と update_at 列がどちらも DATETIME であり、現在の既定値が必要な場合、次の 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 つの列をテーブルに含めることはできないため、ステートメントの順序は重要です。
デフォルトのタイムスタンプを解決できます。最初に、使用している文字セットを検討します。たとえば、utf8 を使用した場合、この文字セットはすべての言語をサポートし、laten1 を使用した場合、この文字セットは英語のみをサポートします。次に設定するプロジェクトで作業している場合は、クライアントのタイム ゾーンを把握し、クライアント ゾーンであることを選択する必要があります。この手順は必須です。