web-dev-qa-db-ja.com

何も指定していなくても、mysqlが挿入/更新時にデフォルトのタイムスタンプを追加するのはなぜですか?

次のようなテーブルがあります。

CREATE TABLE SomeTable (  
    id int unsigned NOT NULL AUTO_INCREMENT,  
    status enum('broken','repaired') NOT NULL,  
    from datetime NOT NULL,  
    until datetime NOT NULL,  
    brought_in timestamp,  
    brought_by varchar(255) NOT NULL,  
    repair_status enum('unpayed', 'payed') DEFAULT NULL,  
    payed_when timestamp,    
    delivered_when timestamp,  
    primary key(id)    
);  

テーブルを作成するとき、SHOW CREATE TABLE次に、列brought_inは、現在のタイムスタンプを持つように定義されていますON INSERTおよびON UPDATE
しかし、私は自分の作成テーブルにそのような命令を追加しませんでした。
なぜ他の列のように空にしないのですか?
これで、別の列の挿入または更新のたびに、現在のタイムスタンプが追加されます。それは欲しくない。
他の列ではそれを行いません。何が悪いのですか?

6
Jim

これは(最初の)timestamp列のデフォルトの動作です。より多くの詳細はドキュメントで読むことができます: TIMESTAMPの自動初期化と更新

これを望まない場合は、テーブルを作成するときにMySQLに明示的に通知する必要があります。デフォルト値(またはデフォルトnull)を宣言すると、自動プロパティは抑制されます。次のいずれかを実行します(動作の違いについて説明します)。


オプション1:not nullおよびdefault 0

brought_in timestamp NOT NULL DEFAULT 0,             -- option 1a

brought_in timestamp DEFAULT 0,                      -- option 1b

これら2つのオプションは同じです。列はNOT NULLとして定義され、デフォルト値は0です。 TIMESTAMPは、NOT NULL対照的にのデフォルトプロパティを持つ唯一のデータ型であり、他のすべてのデータ型およびISO/ANSI規格であることに注意してください。

列にNULLを挿入しようとすると、CURRENT_TIMESTAMPが挿入されます(サプライズ、別のMySQL機能です)。


オプション2:nullおよびdefault null

brought_in timestamp NULL DEFAULT NULL,              -- option 2a

brought_in timestamp NULL,                           -- option 2b

これらは同じで、NULLを許可します(両方ともデフォルトでNULLになります)。

列にNULLを挿入しようとすると、許可されて正常に挿入されます(ここでの驚きはありません)。


オプション3:nullおよびdefault 0またはその他の定数

brought_in timestamp NULL DEFAULT 0,                 -- option 3a

brought_in timestamp NULL DEFAULT '2013-01-01',      -- option 3b

これはオプション2に似ていますが、デフォルト値が異なります。

列にNULLを挿入しようとすると、許可されて正常に挿入されます(ここでも驚きはありません)。

12
ypercubeᵀᴹ