ПОМИЛКА 1067 (42000): Недійсне значення за замовчуванням для 'created_at'


100

Коли я намагався змінити таблицю, вона показала помилку:

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

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

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

а останні два стовпці моєї таблиці - created_atі updated_at.

Ось моя структура таблиці:

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


які значення за замовчуванням для цих стовпців? Чи можете ви поділитися структурою таблиці?
Прияншу

@Priyanshu я оновив структуру таблиці
iamsujit

2
встановити значення за замовчуванням current_timestamp для останніх двох стовпців.
Прияншу

Відповіді:


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)]. Будь-хто може отримати будь-яке рішення без оновлення версії сервера?
Priyabrata Atha

ви перевіряли за глобальною командою? і чи немає в sql_mode нічого для того самого сеансу?
Аман Аггарвал

Я перевірив показ змінних типу "sql_mode"; і результат - ім'я змінної | Значення = sql_mode |
Priyabrata Atha

2
Це буде корисно для цієї відповіді stackoverflow.com/questions/2317650 / ...
Preshan Прадіп

4
Не працював у мене з 5.7. Не впевнений, чи довелося мені робити це глобально чи ні.
Бретт

95

Просто, перш ніж запускати будь-які твердження, поставте це в перший рядок:

SET sql_mode = '';

це було просто приголомшливо. Дякую, чувак!
Новасол

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 = ''все в порядку
Вадим Анісімов

25

Спробуйте виконати таку команду:

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 = ''; на початку файлу, і це працює!



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 зберігається як секунди епохи, значення мітки часу '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/uk/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


ПРИМІТКА . Будь ласка, завжди робіть резервні копії баз даних, перш ніж виконувати оновлення. Дані можуть бути втрачені, якщо оновлення не вдалося або щось пішло не так.




1

Для Mysql5.7 увійдіть в командний рядок mysql і запустіть команду, mysql> показати змінні, такі як 'sql_mode'; Це покаже, що NO_ZERO_IN_DATE, NO_ZERO_DATE в sql_mode.

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

Спробуйте додати рядок нижче [mysqld] у ваш файл конфігурації mysql, щоб видалити два варіанти, мій (mysql 5.7 на Ubuntu 16) - /etc/mysql/mysql.conf.d/mysqld.cnf

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

Тепер перезапустіть mysql. Це працює!


0

Для Mysql8.0.18:

CURRENT_TIMESTAMP([fsp])

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


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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.