2016-02-06 2 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 не разрешает второй штамп времени без значения по умолчанию. – Thomas

ответ

6

Хотя @jsnplank прав, что временные метки обрабатываются по-разному, и вам следует рассмотреть возможность использования типа данных datetime для этих двух конкретных столбцов, однако он не может объяснить сообщение об ошибке.

Сообщение об ошибке, скорее всего, является результатом сочетания того, как mysql обрабатывает поля timestamp, когда не задано значение по умолчанию и настройки вашего режима работы в режиме sql.

  1. Вы определяете оба столбца временной метки как не равные нулю, без какого-либо определенного значения по умолчанию. Это означает, что значение по умолчанию для столбца 1-й метки времени будет current_timestamp() и также будет обновляться до current_timestamp() всякий раз, когда изменяется запись. Вот почему поле 1-й метки времени не генерирует сообщение об ошибке, независимо от того, какая из 2-й является первой.

    Однако значение значения по умолчанию для 2-го не нулевого значения метки времени будет «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» в качестве значения по умолчанию или хотите вставить это значение в любое поле даты.

Таким образом, вы можете использовать тип данных временной метки в таблице, но сделать второй один либо обнуляемым или предоставить 0 или любое действительное число (например, эпохи) в качестве явного значения по умолчанию.

Поскольку вы отмечаете даты начала и окончания с этими полями, dudetime dudetime вместо timestamp, поскольку тип данных может быть хорошей идеей.