2012-03-17 1 views
13

タイムスタンプ列を持つ表を作成すると、その列は、CURRENT_TIMESTAMP更新時にNOT NULL DEFAULT CURRENT_TIMESTAMPとして魔法のように定義されます。これまでのところ奇妙なことを無視して、私はデフォルトを持たず、特別な「更新」の振る舞いを持たないように変更したいと思います。nullではなく、既定値を持たず、更新時に特別な動作をしないタイムスタンプ列を定義できますか?

カラムをNULLに変更すると、デフォルトは魔法のようにNULLに設定され、「更新時」は魔法のように消えることがわかりました。これは素晴らしいですが、私はカラムがNULLでないことを望みます。私が元に戻すと、デフォルトと "更新中"(CURRENT_TIMESTAMPに設定されています)の両方が魔法のように再び現れます。

私はタイムスタンプの代わりにdatetimeを使うことができると知っていますが、タイムゾーンに気付いてタイムスタンプに興味があります(Postgresのタイムゾーン付きタイムスタンプのようです)。

答えて

-1

私はあなたに役立つ素晴らしいソリューションを見つけました。 Disable ON UPDATE

5

タイムスタンプ列は特殊なケースです。 hereを参照してください。デフォルトでは、TIMESTAMP列はNULLではなく、NULL値を含むことはできず、NULLを割り当てることで現在のタイムスタンプが割り当てられます。

詳細については、Data Type Default Valuesを参照してください。

特に、このような状況は、厳密モードで実行していない場合に適用されます。 strictモードで実行している場合、NULLを挿入するとエラーが発生します。

これはそれの世話をする必要があります。

ALTER TABLE tableName ALTER COLUMN columnName DROP DEFAULT; 

問題が解決しない場合は、これはデフォルト(簡単に書き換え)を残すが、ONの更新プログラムを削除することになっていること:

ALTER TABLE tableName CHANGE columnName columnName NOT NULL DEFAULT CURRENT_TIMESTAMP; 

繰り返し列名に注意してください。

+1

うーん、興味深い。私はこれを行うことができました: 'alter table tstest tsタイムスタンプを変更しないデフォルト値0;' 以降: 'alter table tstest alter column ts default;' これは私が望む結果を与えるようです。 より直接的な方法があるのだろうか、理想的にはcreate tableステートメントが理想的です。 – aditsu

+0

だから私は2つのステップでそれを行うことができます:テーブルを作成して(既定では0)、次にデフォルトをドロップします。しかし、奇妙なことは、null値を挿入しようとすると、現在のタイムスタンプを使用していることです(値を指定しない場合は、0が使用されます)。 mysql、y u意味がない? – aditsu

+0

それは特別な場合のようです。 [here](http://dev.mysql.com/doc/refman/5.1/en/timestamp-initialization.html)を参照してください:_デフォルトでは、TIMESTAMP列はNULLではなく、NULL値を含むことはできず、NULLを割り当てることで現在の値を割り当てますtimestamp._ – Ilion

関連する問題