ОШИБКА 1067 (42000): недопустимое значение по умолчанию для created_at.

102

Когда я попытался изменить таблицу, она показала ошибку:

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

Я искал эту ошибку в Google, но все, что я нашел, было так, как будто они пытались изменить метку времени, чтобы это произошло. Однако здесь я пытаюсь добавить новый столбец и получаю эту ошибку:

mysql> ALTER TABLE investments ADD bank TEXT;
ERROR 1067 (42000): Invalid default value for 'created_at'

а последние два столбца в моей таблице - created_atи updated_at.

Вот моя структура таблицы:

введите описание изображения здесь

iamsujit
источник
какие значения по умолчанию для этих столбцов? Не могли бы вы поделиться структурой таблицы?
Priyanshu
@Priyanshu, я обновил структуру своей таблицы
iamsujit
2
установить значение по умолчанию current_timestamp для последних двух столбцов.
Priyanshu

Ответы:

144

Проблема в sql_modes . Пожалуйста, проверьте ваши текущие sql_modes командой:

show variables like 'sql_mode' ; 

И удалите sql_mode " NO_ZERO_IN_DATE, NO_ZERO_DATE », чтобы он заработал. Это sql_mode по умолчанию в новых версиях mysql.

Вы можете установить sql_mode глобально как root командой:

set global sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
Аман Аггарвал
источник
7
Я знаю это, но на моем сервере sql_mode отображается пустым. Все еще не работает, я использую [Версия сервера: 5.5.53-0ubuntu0.12.04.1 - (Ubuntu)]. У кого-нибудь может быть какое-то решение без обновления версии сервера?
Приябрата Ата,
вы проверили глобальную команду? и нет ничего в sql_mode для того же сеанса?
Аман Аггарвал
Я проверил показывать переменные типа sql_mode; и на выходе будет Variable_name | Value = sql_mode |
Приябрата Ата
2
Это будет полезно для ответа stackoverflow.com/questions/2317650/…
Прешан Прадипа
4
У меня не получилось с 5.7. Не уверен, пришлось ли мне делать это глобально или нет.
Бретт
96

Просто, прежде чем запускать какие-либо операторы, поместите это в первую строку:

SET sql_mode = '';
Ахмед Мохамед
источник
это было просто потрясающе. Спасибо, чувак!
Novasol
7
Спасибо за чаевые. Но только снятие ограничений по дате NO_ZERO_IN_DATE,NO_ZERO_DATEпозволяет нам поддерживать только другие функции безопасности:SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
KeitelDOG
1
Для пояснения, этот оператор следует использовать только в разработке, а не в производстве.
Ахмед Мохамед
Просто и прямо по делу.
Фрэнк Фотангс,
28

Я столкнулся с той же ошибкой при попытке установить стороннюю базу данных. Я безуспешно пробовал предложенное решение, т.е.
SET sql_mode = '';

Затем я попробовал команду ниже, которая сработала, позволив установить базу данных.
SET GLOBAL sql_mode = '';

Мартин Мохан
источник
1
SET sql_mode = '';устарел, SET GLOBAL sql_mode = ''все в порядке
Вадим Анисимов
26

Попробуйте выполнить следующую команду:

ALTER TABLE `investments` 
MODIFY created_at TIMESTAMP 
DEFAULT CURRENT_TIMESTAMP 
NOT NULL;

а также

ALTER TABLE `investments` 
MODIFY updated_at TIMESTAMP 
DEFAULT CURRENT_TIMESTAMP 
NOT NULL;

Причина, по которой вы получаете эту ошибку, заключается в том, что вы не устанавливаете значение по умолчанию для created_atиupdated_at полей. MySQL не принимает вашу команду, поскольку значения этих столбцов не могут быть нулевыми.

Надеюсь это поможет.

Мишель Ла Ферла
источник
2
Спасибо, проголосовали за, я предпочитаю это решение в моем случае использования
ChrisR
5

В моем случае у меня есть файл для импорта. Поэтому я просто добавил SET sql_mode = ''; в начале файла и все работает!

Томас
источник
5

Запустите этот запрос:

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

меня устраивает

Ниениус
источник
кстати не нужно SET time_zone = "+00: 00";
Safak Ciplak,
3

Сделать это можно так:

 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;
  • Поскольку значение TIMESTAMP хранится как Epoch Seconds, значение временной метки '1970-01-01 00:00:00' (UTC) зарезервировано, поскольку второй # 0 используется для представления '0000-00-00 00:00:00 '.
  • В MariaDB 5.5 и ранее в таблице мог быть только один столбец TIMESTAMP, для которого CURRENT_TIMESTAMP определен как значение по умолчанию. Это ограничение больше не применяется, начиная с MariaDB 10.0.

см .: https://mariadb.com/kb/en/mariadb/timestamp/

образец

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 []>
Бернд Баффен
источник
3

У меня была аналогичная проблема. Следующее решил это:

Изменить:

recollect_date TIMESTAMP DEFAULT 'CURRENT_TIMESTAMP',

кому:

recollect_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

т.е. просто удалите кавычки вокруг CURRENT_TIMESTAMP .

Надеюсь, это кому-то поможет.

Бхушан
источник
3

Как упоминалось в ответе @Bernd Buffen. Это проблема с MariaDB 5.5, я просто обновил MariaDB 5.5 до MariaDB 10.1, и проблема решена.

Здесь шаги по обновлению MariaDB 5.5 до MariaDB 10.1 в CentOS 7 (64-разрядная версия)

  1. Добавьте следующие строки в репозиторий MariaDB.

    nano /etc/yum.repos.d/mariadb.repo и вставьте следующие строки.

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

  1. Остановите MariaDB, если он уже запущен service mariadb stop
  2. Выполнить обновление

    yum update

  3. Запуск MariaDB и выполнение обновления

    service mariadb start

    mysql_upgrade

Все сделано.

Проверьте версию MariaDB: mysql -V


ПРИМЕЧАНИЕ . Всегда делайте резервную копию баз данных перед выполнением обновлений. Данные могут быть потеряны, если обновление не удалось или что-то пошло не так.

Хасан
источник
3
SET GLOBAL sql_mode = '';

Решил мою проблему.

Онди Гушо
источник
2

Просто преобразуйте его в эту строку:

для новой таблицы:

CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

для существующей таблицы:

Alter ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

Источник :

https://dev.mysql.com/doc/refman/5.5/en/timestamp-initialization.html

Тарек Гамаль Эль-дин
источник
2

Для Mysql5.7 войдите в командную строку mysql и выполните команду,

mysql> show variables like 'sql_mode' ;

Он покажет, что NO_ZERO_IN_DATE, NO_ZERO_DATE в sql_mode.

введите описание изображения здесь

Попробуйте добавить строку ниже [mysqld] в свой файл mysql conf, чтобы удалить два варианта, мой (mysql 5.7 в Ubuntu 16) - это /etc/mysql/mysql.conf.d/mysqld.cnf

введите описание изображения здесь

Теперь перезапустите mysql. Оно работает!

Маладжиси
источник
0

Для Mysql8.0.18:

CURRENT_TIMESTAMP([fsp])

Удаление "([fsp])", решило мою проблему.

imldp
источник
0
  1. Сначала проверьте, что существующие режимы используют следующую команду в вашем терминале:

    $ mysql -u root -p -e "SHOW VARIABLES LIKE 'sql_mode';"

    или

    mysql> show variables like 'sql_mode';

    Вы увидите результат, как показано ниже

    введите описание изображения здесь

  2. Отключить режим (ы) через my.cnf: в этом случае вам необходимо удалить режимы NO_ZERO_IN_DATE, NO_ZERO_DATE

    Откройте файл my.cnf (обычно вы можете найти файл my.cnf, расположенный в /etc/my.cnf или /etc/mysql/my.cnf)

    Режимы обновления в my.cnf под [mysqld]заголовком

    sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

    Здесь я пропустил режимы NO_ZERO_IN_DATE, NO_ZERO_DATE

  3. Перезагрузите сервер mysql

    $ /etc/init.d/mysql restart

Тушан
источник