2016-02-06 14 views
5

次のSQLを見てください。MySQLデフォルト値が指定されていない場合のタイムスタンプのデフォルト値が無効です。

CREATE SCHEMA IF NOT EXISTS `scheduler`; 
USE `scheduler` ; 
CREATE TABLE IF NOT EXISTS `scheduler`.`JobHistory` (
    `Id` INT NOT NULL AUTO_INCREMENT, 
    `Job` INT NOT NULL, 
    `StartTime` TIMESTAMP NOT NULL, 
    `FinishTime` TIMESTAMP NOT NULL, 
    PRIMARY KEY (`Id`), 
    INDEX `fk_JobHistory_Job_idx` (`Job` ASC)); 

それはErrorCode: 1067. Invalid default value for 'Finish Time' を投げている。しかし、私もまったく同じであると私はそのいずれかの例外が届かない別のタイムスタンプStartTimeがあり、終了時刻のための任意のデフォルト値を与えていませんよ。

+1

興味深いことに、StartTime列またはFinishTime列のいずれかを削除しても正常に動作します。 MySQLはデフォルト値なしの2回目のタイムスタンプを許可していないようです。 – Thomas

答えて

6

@jsnplankはタイムスタンプが異なって扱われますが、これら2つの特定の列に対してdatetimeデータ型を使用することを検討する必要がありますが、エラーメッセージの説明に失敗します。

エラーメッセージは、デフォルト値が指定されていないときにmysqlがタイムスタンプフィールドをどのように処理するか、およびSQLモード設定を組み合わせた結果として発生している可能性があります。

  1. 両方のタイムスタンプ列をNULL以外の値として定義します。特定のデフォルト値は設定されません。つまり、最初のタイムスタンプ列のデフォルト値はcurrent_timestamp()になり、レコードが変更されるたびにcurrent_timestamp()に更新されます。このため、第1のタイムスタンプフィールドは、第2のタイムスタンプフィールドに関係なく、エラーメッセージを生成しません。

    ただし、デフォルト値を明示的に定義しない場合、2番目のNULLでないタイムスタンプ列のデフォルト値は '0000-00-00 00:00:00'になります。

    this blog post for more detailsを参照してください。

  2. おそらくno_zero_date SQLモードは、明示的にまたは厳密なSQLモードの一部としてサーバーで有効になります。このSQLモードは、デフォルト値として '0000-00-00 00:00:00'を設定するか、この値を任意の日付フィールドに挿入する場合にエラーを生成します。

だから、あなたはあなたのテーブルにタイムスタンプデータ型を使用しますが、第二1がNULL可能のどちらかにするか、明示的なデフォルト値として0か(例えばエポックなど)任意の有効な日付を提供することができます。

これらのフィールドに開始日と終了日をマークするので、データ型としてtimestampの代わりにdatetimeを指定するとよいでしょう。

関連する問題