Niepoprawna wartość domyślna pola znacznika czasu „create_date”


186

Mam następującą instrukcję sql create

mysql> CREATE  TABLE IF NOT EXISTS `erp`.`je_menus` (
    ->   `id` INT(11) NOT NULL AUTO_INCREMENT ,
    ->   `name` VARCHAR(100) NOT NULL ,
    ->   `description` VARCHAR(255) NOT NULL ,
    ->   `live_start_date` DATETIME NULL DEFAULT NULL ,
    ->   `live_end_date` DATETIME NULL DEFAULT NULL , 
    ->   `notes` VARCHAR(255) NULL ,
    ->   `create_date` TIMESTAMP NOT NULL DEFAULT  '0000-00-00 00:00:00',
    ->   `created_by` INT(11) NOT NULL ,
    ->   `update_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP  ,
    ->   `updated_by` INT(11) NOT NULL , 
    ->   `status` VARCHAR(45) NOT NULL ,
    ->   PRIMARY KEY (`id`) ) 
    -> ENGINE = InnoDB;

podając następujący błąd

ERROR 1067 (42000): Invalid default value for 'create_date'

Jaki jest tutaj błąd?


Nie widzę nic złego w twoim zapytaniu i działa na testowanej właśnie społeczności 5.1.50.
Jaspreet Chahal

Zapytanie jest również w moim porządku.
Shakti Singh

Nie jesteś pewien, ale nadaj temu polu inną nazwę i spróbuj?
Naveen Kumar

Używam społeczności mysql 5.1.56 w systemie Ubuntu 10.04. i nie działa
Robert

5
Data bez zera wymaga daty. Użyj „1970-01-01 00:00:01”. [wzięte stąd] [1] [1]: dba.stackexchange.com/questions/6171/…
Jadeye

Odpowiedzi:


176

Wynika to z trybu SQL serwera - NO_ZERO_DATE .

Z referencji: NO_ZERO_DATE- W trybie ścisłym nie zezwalaj '0000-00-00'na prawidłową datę. Nadal możesz wstawiać zerowe daty za pomocą opcji IGNORE . Gdy nie jest w trybie ścisłym, data jest akceptowana, ale generowane jest ostrzeżenie.


19
jak dać opcję ignorowania?
Robert

9
Nie możesz zignorować tej opcji. To jest opcja serwera. Jeśli masz dostęp do my.ini (plik konfiguracyjny mysql), usuń NO_ZERO_DATE z opcji trybu sql i zrestartuj serwer.
Devart,

7
Aby sprawdzić tę opcję - uruchom SHOW VARIABLES LIKE 'sql_mode'
Devart

6
Wygenerowałem skrypt za pomocą mysql workbench. W skrypcie tryb sql_mode jest ustawiony na tradycyjny. Jeśli usunę tradycyjny, skrypt działa.
Robert

17
W preferencjach MySQL Workbench przejdź do zakładki „Model: MySQL”. Ustawiono „SQL_MODE do użycia w wygenerowanych skryptach” na „STRICT_TRANS_TABLES, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION” To rozwiązuje problem na dobre.
sgtdck

140

Jeśli wygenerowałeś skrypt ze środowiska roboczego MySQL.

Generowany jest następujący wiersz

SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

Usuń TRADITIONAL z SQL_MODE, a następnie skrypt powinien działać poprawnie

W przeciwnym razie możesz ustawić SQL_MODE jako Zezwalaj na nieprawidłowe daty

SET SQL_MODE='ALLOW_INVALID_DATES';

1
Zaoszczędził mi trochę czasu na szukanie, dlaczego, u diabła, nie działa :)
Srneczek

5
Achhh dziękuję SET SQL_MODE = 'ALLOW_INVALID_DATES'; ratował życie. Miałem ten problem, gdy próbowałem migrować witrynę Wordpress na inny serwer (zarówno lokalny) i nie pozwoliło mi to zaimportować danych bazy danych z powodu tego błędu, nawet jeśli nie było żadnych wierszy w tabelach z tym błędem.
mikato,

Działa jak urok! Dziękuję Ci.
moreirapontocom

52

TIMESTAMP ma zakres od „1970-01-01 00:00:01” UTC do „2038-01-19 03:14:07” UTC (patrz dokument ). Wartość domyślna musi mieścić się w tym zakresie.

Inne dziwne, pokrewne zachowania:

CREATE TABLE tbl1 (
    ts TIMESTAMP);  
Query OK, 0 rows affected (0.01 sec)

CREATE TABLE tbl2 (
    ts TIMESTAMP,
    ts2 TIMESTAMP);
ERROR 1067 (42000): Invalid default value for 'ts2'

CREATE TABLE tbl3 (
    ts TIMESTAMP,
    ts2 TIMESTAMP DEFAULT '1970-01-01 00:00:01');
Query OK, 0 rows affected (0.01 sec)

Uwaga dodatkowa, jeśli chcesz wstawić NULLS:

CREATE TABLE tbl4 (
    ts TIMESTAMP NULL DEFAULT NULL);

1
To mi się przydarza. Co się dzieje? ts2 nie jest nawet „NOT NULL” ...!
PedroD

2
Być może dlatego, że „jeśli nie ustawisz wartości dla pierwszej kolumny TIMESTAMP w tabeli, MariaDB automatycznie przypisze jej bieżącą datę i godzinę podczas wykonywania zapytania UPDATE lub INSERT w danym wierszu (wierszach)”. - MariaDB Docs
jsphpl

1
Lubię używać column_name TIMESTAMP DEFAULT NOW(). Może nie być odpowiednie dla każdej sytuacji, ale pomyślałem, że podzielę się tym, ponieważ ja też się tym zajmowałem.
DeezCashews

1
column_name TIMESTAMP DEFAULT '1970-01-01 00:00:01' załatwiło sprawę. Dzięki!
metafa

42

W Ubuntu Desktop 16.04 zrobiłem to:

  1. otwórz plik: /etc/mysql/mysql.conf.d/mysqld.cnfw wybranym edytorze.

  2. Poszukaj:, sql_modebędzie gdzieś pod [mysqld].

  3. i ustaw sql_modena następujące:

    NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

  4. Zapisz, a następnie uruchom ponownie usługę mysql, wykonując:

    sudo service mysql restart


8
Pomogło, poza tym, że sql_modenie było go dla mojej instancji mySQL na ubuntu16.04. Musiałem dodać wpis w pliku, usuwając „NO_ZERO_DATE”. Tak, o to, jak wygląda teraz: #Adding poniżej linii pozbyć no_zero_date sql_mode = ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION
OK999

masz rację .. Dodałem to wcześniej, aby wyłączyć tryb ścisły .. i kiedy go edytowałem dla tego konkretnego problemu, sql_modewpis już tam był.
Mubashar Abbas,

Czy to błąd? CURRENT_TIMESTAMP nigdy nie powinien zwracać „0000-00-00 00:00:00”, czy się mylę? Dlaczego powinienem zmienić ustawienia mysqld?
Let'sjump

@letsjump, ponieważ ktoś nieprawidłowo skonfigurował serwer mysql. Uderzam w ten problem z zaimportowaną bazą danych. domyślna wartość znacznika czasu w kolumnie nie jest prawidłową wartością znacznika czasu. PRAWDZIWA poprawka polega na aktualizacji domyślnego znacznika czasu na coś ważnego jak 1970 - najwcześniejsza dostępna data. Tymczasowym obejściem jest wyłączenie sprawdzania bazy danych.
anon58192932,

9

Używając OS X , zainstaluj mysql z Homebrew , Zmienne systemowe oparte na jego domyślnych ustawieniach. Rozwiązaniem jest usunięcie „NO_ZERO_DATE” ze zmiennych systemowych „tryb_sql”.

Pamiętaj tylko, że zakres obejmuje.

Jeśli chcesz wpływać tylko na sesję, użyj "@@session", Na przykład:

SET @@session.sql_mode ="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION".

W takim przypadku nie wpłynie to na zakończenie sesji ani jej zmianę. Nie ma wpływu na inną sesję.

Jeśli chcesz wpływać na wszystkich klientów, użyj "@@global"na przykład:

SET @@global.sql_mode ="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION".

W takim przypadku wpływa to tylko na klientów, którzy łączą się po zmianie (nie wpływa na bieżących wszystkich klientów) i nie będzie działać po wyjściu serwera.


8

Udało mi się rozwiązać ten problem w systemie OS X, instalując MySQL z Homebrew

brew install mysql

dodając następujące elementy do /usr/local/etc/my.cnf

sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

i restart MySQL

brew tap homebrew/services
brew services restart mysql

7

Miałem podobny problem z MySQL 5.7 z następującym kodem:

`update_date` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP

Naprawiłem to za pomocą tego zamiast:

`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP


2
Myślę, że jest to w rzeczywistości najlepsza opcja, ponieważ gdy domyślnie ma sens domyślny do prądu, nie ma to jednak sensu w przypadku znacznika czasu urodzenia - na przykład.
miau

7

Aby uniknąć tego problemu, musisz usunąć NO_ZERO_DATEz konfiguracji trybu mysql.

  1. Przejdź do „phpmyadmin”.
  2. Po załadowaniu phpmyadmin kliknij kartę „zmienne”.
  3. Wyszukaj „tryb sql”.
  4. Kliknij opcję Edytuj i usuń NO_ZERO_DATE(wraz z końcowym przecinkiem) z konfiguracji.

Jest to bardzo częsty problem w środowisku lokalnym z wamp lub xamp.


6

Wystarczy zdefiniować następujące wiersze u góry pliku bazy danych SQL.

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

To działa dla mnie.


2

Aby wyłączyć tryb ścisłego SQL

Create disable_strict_mode.cnf file at /etc/mysql/conf.d/

W pliku wprowadź następujące dwa wiersze:

[mysqld]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Na koniec zrestartuj MySQL za pomocą tego polecenia:

sudo service mysql restart

1

Może chcesz sprawdzić ustawienie strefy czasowej w instancji MySql:

mysql> show variables like 'time_zone';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| time_zone     | SYSTEM |
+---------------+--------+

w moim przypadku zdałem sobie sprawę, że system bazowy ma strefę czasową ustawioną na BST zamiast UTC, więc w tabeli tworzenia domyślnie „1970-01-01 00:00:01” było wymuszone o 1 godzinę wstecz, co spowodowało niepoprawna wartość znacznika czasu.

Dla mnie naprawdę chciałem ustawić strefę czasową maszyny na UTC, i to mnie załatwiło. Kiedy prowadziłem Centos / 7, po prostu tak zrobiłem

# timedatectl set-timezone UTC

i wszystko zrestartowałem.


1

Wartości domyślne powinny zaczynać się od roku 1000.

Na przykład,

ALTER TABLE mytable last_active DATETIME DEFAULT '1000-01-01 00:00:00'

Mam nadzieję, że to komuś pomoże.


1

Zmień to:

`create_date` TIMESTAMP NOT NULL DEFAULT  '0000-00-00 00:00:00',
`update_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP  ,

Do następujących:

`create_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP ,
`update_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,

1
Z recenzji: Cześć, proszę nie odpowiadać tylko kodem źródłowym. Spróbuj podać ładny opis działania twojego rozwiązania. Zobacz: Jak napisać dobrą odpowiedź? . Dzięki
sɐunıɔ ןɐ qɐp

Jeśli jest to witryna WordPress, nie aktualizuj podstawowych tabel WordPress. Wiele wtyczek oczekuje wartości zeores, więc WordPress nie może zmienić tej wartości domyślnej z powodów starszych, które mogłyby uszkodzić wtyczki. Wątek Wordpress i obsługa Wordpress . Zmiana struktury bazy danych bez znajomości kodu opartego na wartościach domyślnych może prowadzić do kłopotliwych błędów. Chociaż może to działać jako rozwiązanie w wielu przypadkach, może zniszczyć spustoszenie w innych. Nie jest to uniwersalne rozwiązanie.
SherylHohman

0

Możesz to po prostu zmienić:

`create_date` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',

Do czegoś takiego:

`create_date` TIMESTAMP NOT NULL DEFAULT '2018-04-01 12:00:00',

0

Możesz to po prostu zmienić:

create_date datetime NOT NULL DEFAULT „0000-00-00 00:00:00”,

Do czegoś takiego:

create_date varchar (80) NOT NULL DEFAULT „0000-00-00 00:00:00”,

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.