2016-02-06 12 views
5

Sprawdź następujący sql.MySQL Nieprawidłowa wartość domyślna dla znacznika czasu, gdy nie podano wartości domyślnej.

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)); 

To jest rzucanie ErrorCode: 1067. Invalid default value for 'Finish Time' Ale ja nie daję żadnej wartości domyślnej czas mety, również nie ma innej datownik StartTime który jest dokładnie taki sam, a ja nie dostaję żadnego wyjątku dla tego jednego.

+1

Co ciekawe, jeśli usuniemy kolumnę StartTime lub kolumnę FinishTime, wszystko będzie działać poprawnie. Wygląda na to, że MySQL nie zezwala na drugi znacznik czasu bez wartości domyślnej. – Thomas

Odpowiedz

6

Chociaż @jsnplank ma rację, że znaczniki czasu są traktowane inaczej i należy rozważyć użycie datetime w datachpe dla tych 2 kolumn, jednak nie wyjaśnia on komunikatu o błędzie.

Komunikat o błędzie jest najprawdopodobniej wynikiem połączenia sposobu, w jaki mysql traktuje znaczniki czasu, gdy nie podano wartości domyślnej, oraz ustawienia trybu sql.

  1. Kolumny znacznika czasu są definiowane jako nie puste, bez określonego zestawu wartości domyślnych. Oznacza to, że domyślna wartość pierwszego znacznika czasu będzie miała wartość current_timestamp(), a także będzie aktualizowana do current_timestamp(), gdy tylko rekord się zmieni. Dlatego pole pierwszego znacznika czasu nie generuje komunikatu o błędzie, bez względu na to, który z 2 jest pierwszy.

    Jednak druga domyślna wartość kolumny nie jest nullowana to "0000-00-00 00:00:00", jeśli nie zdefiniujesz jawnie wartości domyślnej.

    Zobacz this blog post for more details.

  2. Prawdopodobnie no_zero_date Tryb sql jest również włączony na serwerze jawnie lub jako część ścisłego trybu sql. Ten tryb sql generuje błąd, jeśli chcesz ustawić "0000-00-00 00:00:00" jako wartość domyślną lub chcesz wstawić tę wartość do dowolnego pola daty.

Tak, można użyć typu danych timestamp w tabeli, ale sprawiają, że 2 jeden albo pustych lub dostarczyć 0 lub dowolna, ważne daty (takie jak epoki) jako wyraźnej wartości domyślnej.

Ponieważ w tych polach są datki początkowe i końcowe, udane datetime zamiast timestamp jako typ danych może być dobrym pomysłem.

Powiązane problemy