BŁĄD 1067 (42000): Nieprawidłowa wartość domyślna dla „created_at”

105

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_ati updated_at.

Oto moja struktura tabeli:

wprowadź opis obrazu tutaj

iamsujit
źródło
jakie są domyślne wartości dla tych kolumn? Czy możesz podzielić się strukturą tabeli?
Priyanshu
@Priyanshu Zaktualizowałem strukturę mojej tabeli
iamsujit
2
ustaw wartość domyślną current_timestamp dla ostatnich dwóch kolumn.
Priyanshu

Odpowiedzi:

151

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';
Aman Aggarwal
źródło
7
Wiem o tym, ale na moim serwerze sql_mode wyświetla się puste, Nadal nie działa, używam [Wersja serwera: 5.5.53-0ubuntu0.12.04.1 - (Ubuntu)]. Każdy może mieć jakieś rozwiązanie bez aktualizacji wersji serwera?
Priyabrata Atha
czy sprawdziłeś przez polecenie globalne? i czy nie ma nic w sql_mode dla tej samej sesji?
Aman Aggarwal,
Sprawdziłem pokaż zmienne, takie jak „sql_mode”; a wynik to nazwa_zmiennej | Wartość = tryb_sql |
Priyabrata Atha
2
Będzie to przydatne w przypadku tej odpowiedzi stackoverflow.com/questions/2317650/…
Preshan Pradeepa
4
Nie działało dla mnie z 5.7. Nie jestem pewien, czy musiałem to zrobić globalnie, czy nie.
Brett
99

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.

Ahmed Mohamed
źródło
to było po prostu niesamowite. Dzięki stary!
Novasol
7
Dzięki za wskazówkę. Ale tylko usunięcie ograniczeń daty NO_ZERO_IN_DATE,NO_ZERO_DATEpozwala 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';
KeitelDOG
1
Dla wyjaśnienia, to stwierdzenie powinno być używane tylko w fazie rozwoju, a nie w produkcji.
Ahmed Mohamed
29

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 = '';

Martin Mohan
źródło
1
SET sql_mode = '';jest teraz przestarzały, SET GLOBAL sql_mode = ''jest OK
Vadim Anisimov
26

Spró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_atupdated_at pól i . MySQL nie akceptuje twojego polecenia, ponieważ wartości tych kolumn nie mogą być puste.

Mam nadzieję że to pomoże.

Michele La Ferla
źródło
2
Dziękuję za głosy, wolę to rozwiązanie w moim przypadku użycia
ChrisR
6

W moim przypadku mam plik do zaimportowania.
Więc po prostu dodałem SET sql_mode = '';na początku pliku i działa!

Tomás
źródło
5

Uruchom to zapytanie:

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

mi to pasuje

nyenius
źródło
przy okazji nie trzeba SET time_zone = "+00: 00";
Safak Ciplak
3

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;
  • Ponieważ wartość TIMESTAMP jest przechowywana w sekundach epoki, wartość znacznika czasu „1970-01-01 00:00:00” (UTC) jest zarezerwowana, ponieważ drugi numer 0 jest używany do reprezentowania „0000-00-00 00:00:00” ”.
  • W MariaDB 5.5 i wcześniejszych mogła istnieć tylko jedna kolumna TIMESTAMP na tabelę, dla której CURRENT_TIMESTAMP zdefiniowano jako wartość domyślną. Ten limit nie ma już zastosowania od wersji MariaDB 10.0.

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 []>
Bernd Buffen
źródło
3

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.

Bhushan
źródło
3

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)

  1. Dodaj następujące wiersze do repozytorium MariaDB.

    nano /etc/yum.repos.d/mariadb.repo i wklej następujące wiersze.

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey = https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck = 1

  1. Zatrzymaj MariaDB, jeśli już działa service mariadb stop
  2. Wykonaj aktualizację

    yum update

  3. 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.

Hassaan
źródło
3
SET GLOBAL sql_mode = '';

Rozwiązał mój problem.

ondi gusho
źródło
2

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.

wprowadź opis obrazu tutaj

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

wprowadź opis obrazu tutaj

Teraz uruchom ponownie mysql. To działa!

malajisi
źródło
0

Dla Mysql8.0.18:

CURRENT_TIMESTAMP([fsp])

Usuń „([fsp])”, rozwiązałem mój problem.

imldp
źródło
0
  1. 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

    wprowadź opis obrazu tutaj

  2. 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łówkiem

    sql_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

  3. Zrestartuj serwer mysql

    $ /etc/init.d/mysql restart

Thushan
źródło