Kiedy próbowałem zmienić tabelę, pokazał błąd:
ERROR 1067 (42000): Invalid default value for 'created_at'
Wyszukałem w Google ten błąd, ale wszystko, co znalazłem, to tak, jakby próbowali zmienić sygnaturę czasową, więc tak się stało. Jednak tutaj próbuję dodać nową kolumnę i otrzymuję ten błąd:
mysql> ALTER TABLE investments ADD bank TEXT;
ERROR 1067 (42000): Invalid default value for 'created_at'
a ostatnie dwie kolumny mojej tabeli to created_at
i updated_at
.
Oto moja struktura tabeli:
Odpowiedzi:
Problem jest spowodowany trybami sql_modes . Sprawdź aktualne tryby_sql za pomocą polecenia:
show variables like 'sql_mode' ;
I usuń tryb sql_mode „ NO_ZERO_IN_DATE, NO_ZERO_DATE ”, aby działał. To jest domyślny tryb sql_mode w nowych wersjach mysql.
Możesz ustawić sql_mode globalnie jako root za pomocą polecenia:
set global sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
źródło
Po prostu, zanim uruchomisz jakiekolwiek instrukcje, umieść to w pierwszej linii:
SET sql_mode = '';
UWAGA: to stwierdzenie powinno być używane tylko w fazie rozwoju, a nie w produkcji.
źródło
NO_ZERO_IN_DATE,NO_ZERO_DATE
pozwala nam zachować tylko inne funkcje bezpieczeństwa:SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
Napotkałem ten sam błąd podczas próby zainstalowania bazy danych innej firmy. Bezskutecznie wypróbowałem zaproponowane rozwiązanie tj
SET sql_mode = '';
Następnie wypróbowałem poniższe polecenie, które zadziałało, umożliwiając zainstalowanie bazy danych
SET GLOBAL sql_mode = '';
źródło
SET sql_mode = '';
jest teraz przestarzały,SET GLOBAL sql_mode = ''
jest OKSpróbuj i uruchom następujące polecenie:
ALTER TABLE `investments` MODIFY created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL;
i
ALTER TABLE `investments` MODIFY updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL;
Powodem, dla którego otrzymujesz ten błąd, jest to, że nie ustawiasz domyślnej wartości dla
created_at
updated_at
pól i . MySQL nie akceptuje twojego polecenia, ponieważ wartości tych kolumn nie mogą być puste.Mam nadzieję że to pomoże.
źródło
W moim przypadku mam plik do zaimportowania.
Więc po prostu dodałem
SET sql_mode = '';
na początku pliku i działa!źródło
Uruchom to zapytanie:
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; SET time_zone = "+00:00";
mi to pasuje
źródło
Możesz to zrobić w ten sposób:
CREATE TABLE `ttt` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `t1` TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00', `t2` TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00', `t3` TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00', `t4` TIMESTAMP NULL DEFAULT 0, PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8;
patrz: https://mariadb.com/kb/en/mariadb/timestamp/
próba
MariaDB []> insert into ttt (id) VALUES (1),(2),(3); Query OK, 3 rows affected (0.01 sec) Records: 3 Duplicates: 0 Warnings: 0 MariaDB []> select * from ttt; +----+---------------------+---------------------+---------------------+---------------------+ | id | t1 | t2 | t3 | t4 | +----+---------------------+---------------------+---------------------+---------------------+ | 1 | 0000-00-00 00:00:00 | 2000-01-01 12:01:02 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | | 2 | 0000-00-00 00:00:00 | 2000-01-01 12:01:02 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | | 3 | 0000-00-00 00:00:00 | 2000-01-01 12:01:02 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | +----+---------------------+---------------------+---------------------+---------------------+ 3 rows in set (0.00 sec) MariaDB []>
źródło
Miałem podobny problem. Po rozwiązaniu:
Zmiana:
recollect_date TIMESTAMP DEFAULT 'CURRENT_TIMESTAMP',
do:
recollect_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
tzn. po prostu usuń cudzysłowy wokół CURRENT_TIMESTAMP .
Mam nadzieję, że to komuś pomoże.
źródło
Jak wspomniano w odpowiedzi @Bernd Buffen. Jest to problem z MariaDB 5.5, po prostu uaktualniam MariaDB 5.5 do MariaDB 10.1 i problem został rozwiązany.
Oto kroki, aby zaktualizować MariaDB 5.5 do MariaDB 10.1 w CentOS 7 (64-bitowy)
Dodaj następujące wiersze do repozytorium MariaDB.
nano /etc/yum.repos.d/mariadb.repo
i wklej następujące wiersze.service mariadb stop
Wykonaj aktualizację
yum update
Uruchamianie MariaDB i wykonywanie aktualizacji
service mariadb start
mysql_upgrade
Wszystko zrobione.
Sprawdź wersję MariaDB:
mysql -V
UWAGA : Przed wykonaniem aktualizacji należy zawsze wykonać kopię zapasową baz danych. Dane mogą zostać utracone, jeśli aktualizacja się nie powiedzie lub coś poszło nie tak.
źródło
SET GLOBAL sql_mode = '';
Rozwiązał mój problem.
źródło
Po prostu przekonwertuj go według tej linii:
dla nowej tabeli:
CREATE TABLE t1 ( ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );
dla istniejącej tabeli:
Alter ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
Źródło :
https://dev.mysql.com/doc/refman/5.5/en/timestamp-initialization.html
źródło
W przypadku Mysql5.7 zaloguj się w wierszu poleceń mysql i uruchom polecenie,
mysql> show variables like 'sql_mode' ;
Pokaże, że NO_ZERO_IN_DATE, NO_ZERO_DATE w sql_mode.
Spróbuj dodać wiersz poniżej [mysqld] w pliku konfiguracyjnym mysql, aby usunąć dwie opcje, moja (mysql 5.7 na Ubuntu 16) to /etc/mysql/mysql.conf.d/mysqld.cnf
Teraz uruchom ponownie mysql. To działa!
źródło
Dla Mysql8.0.18:
Usuń „([fsp])”, rozwiązałem mój problem.
źródło
Najpierw sprawdź, czy istniejące tryby używają następującego polecenia w twoim terminalu:
$ mysql -u root -p -e "SHOW VARIABLES LIKE 'sql_mode';"
lub
mysql> show variables like 'sql_mode';
Zobaczysz dane wyjściowe jak poniżej
Wyłącz tryby przez my.cnf: w tym przypadku musisz usunąć tryby NO_ZERO_IN_DATE, NO_ZERO_DATE
Otwórz plik my.cnf (zazwyczaj można znaleźć plik my.cnf znajdujący się w /etc/my.cnf lub /etc/mysql/my.cnf)
Aktualizuj tryby w my.cnf pod
[mysqld]
nagłówkiemsql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Tutaj pominąłem tryby NO_ZERO_IN_DATE, NO_ZERO_DATE
Zrestartuj serwer mysql
$ /etc/init.d/mysql restart
źródło