空文字 - mysql カラム追加 デフォルト値




MySQL Datetimeカラムのデフォルト値はどのように設定しますか? (16)

MySQL Datetimeカラムのデフォルト値はどのように設定しますか?

SQL Serverではgetdate()です。 MySQLと同等のものは何ですか? MySQL 5.xを使用しています。


MySQL 5.1でこれを行う方法は次のとおりです:

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

なぜカラム名を二度入力しなければならないのか分かりません。


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

つまり、トリガーを作成することでこれを達成できます。

私はDateTime型のDateCreatedフィールドを持つテーブルを持っています。 私はそのテーブルに "Before Insert"と " SET NEW.DateCreated=NOW() "というトリガを作成しました。

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


now()を使用してdatetime列の値を設定できますが、デフォルト値として使用することはできません。



重要な編集: 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ステートメントに "[あなたのカラム名] = [あなたのカラム名]"(またはその他の値)を含める必要があり、値が "now()"になることを意味します。 奇妙だが、真実。 私はこれが役立つことを願っています 私は5.5.56-MariaDBを使用しています**



すでにテーブルを作成している場合は、

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

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';

たとえば、DATETIMEでデフォルト値が必要なcreated_atとupdate_atカラムを持つ '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;

表には、TIMESTAMP型の2つの列を持つことができないため、ステートメントの順序は重要です。デフォルト値はCUREENT TIMESTAMPです。


デフォルトの定義でDATETIMEでこれを行うことはできませんが、select文を次のようにinsert文に組み込むことができます:

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

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

MySQL 5.5の場合


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


トリガーを使用して、この種の処理を行うことができます。

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;

バージョン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 : http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available.html


私にとってトリガーのアプローチは一番うまくいきましたが、私はそのアプローチに悩まされました。 挿入時に現在の日付フィールドに日付フィールドを設定するための基本的なトリガを考えてみましょう:

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つのdatetimeフィールドを持っていた私のテーブルでこの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()関数が動作することを期待するように機能します。 ヌルを挿入するか、created_dtおよびupdated_dtフィールドを無視すると、両方のフィールドで完全なタイムスタンプ値が得られます。 行の更新によってupdated_dtが変更されます。 MySQLクエリブラウザ経由でレコードを挿入する場合は、もう一つのステップが必要でした。新しいタイムスタンプで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コンパイラによって取得されるため、区切り文字を変更する必要があります。 例えば

DELIMITER //
CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON `MyTable`
FOR EACH ROW BEGIN
        -- Set the udpate date
    Set new.UpdateDate = now();
END//
DELIMITER ;

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

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年であなたのソフトウェアを壊すでしょう。

データベース側の唯一の解決策は、他の回答に記載されているようなトリガーを使用することだと私は信じています。







datetime