次のようなテーブルがあります。
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
。
しかし、私は自分の作成テーブルにそのような命令を追加しませんでした。
なぜ他の列のように空にしないのですか?
これで、別の列の挿入または更新のたびに、現在のタイムスタンプが追加されます。それは欲しくない。
他の列ではそれを行いません。何が悪いのですか?
これは(最初の)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
を挿入しようとすると、許可されて正常に挿入されます(ここでも驚きはありません)。