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?
Odpowiedzi:
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.źródło
Jeśli wygenerowałeś skrypt ze środowiska roboczego MySQL.
Generowany jest następujący wiersz
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
źródło
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:
Uwaga dodatkowa, jeśli chcesz wstawić NULLS:
źródło
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.W Ubuntu Desktop 16.04 zrobiłem to:
otwórz plik:
/etc/mysql/mysql.conf.d/mysqld.cnf
w wybranym edytorze.Poszukaj:,
sql_mode
będzie gdzieś pod[mysqld]
.i ustaw
sql_mode
na następujące:NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Zapisz, a następnie uruchom ponownie usługę mysql, wykonując:
sudo service mysql restart
źródło
sql_mode
nie 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_SUBSTITUTIONsql_mode
wpis już tam był.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: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: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.
źródło
Udało mi się rozwiązać ten problem w systemie OS X, instalując MySQL z Homebrew
dodając następujące elementy do /usr/local/etc/my.cnf
i restart MySQL
źródło
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
źródło
Aby uniknąć tego problemu, musisz usunąć
NO_ZERO_DATE
z konfiguracji trybu mysql.NO_ZERO_DATE
(wraz z końcowym przecinkiem) z konfiguracji.Jest to bardzo częsty problem w środowisku lokalnym z wamp lub xamp.
źródło
Wystarczy zdefiniować następujące wiersze u góry pliku bazy danych SQL.
To działa dla mnie.
źródło
Aby wyłączyć tryb ścisłego SQL
W pliku wprowadź następujące dwa wiersze:
Na koniec zrestartuj MySQL za pomocą tego polecenia:
źródło
Może chcesz sprawdzić ustawienie strefy czasowej w instancji MySql:
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
i wszystko zrestartowałem.
źródło
Wartości domyślne powinny zaczynać się od roku 1000.
Na przykład,
Mam nadzieję, że to komuś pomoże.
źródło
Zmień to:
Do następujących:
źródło
Możesz to po prostu zmienić:
Do czegoś takiego:
źródło
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”,źródło