The question is too broad for the answer. There are many problems regarding these questions, even more so when the incompatibility of the different MySQL-based engines is notorious.
For me the best option is to know the state of variables at the time of making the backup with the option —opt (mysqldump —opt) and apply it to our backup if it does not have it as usual, either because the original backup I did not have it, or because the one that has happened to us is incorrect.
If the backup does not contain the settings with which it was made, we will have to start investigating, but basically we can do it like this.
Add SETtings to header of backup
echo '
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!50606 SET @OLD_INNODB_STATS_AUTO_RECALC=@@INNODB_STATS_AUTO_RECALC */;
/*!50606 SET GLOBAL INNODB_STATS_AUTO_RECALC=OFF */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;' | cat - mybackup.sql > temp && mv temp mybackup.sql
Add restore SETtings to end
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!50606 SET GLOBAL INNODB_STATS_AUTO_RECALC=@OLD_INNODB_STATS_AUTO_RECALC */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;' >> mybackup.sql
If you don’t have those settings you can make a mysqldump backup with the —opt option on the original server, in order to get them.
If you don’t have it, you can go little by little, setting the necessary settings, both at the start and at the exit.
The post_date default value is 0000-00-00 00:00:00. If you check the sql_mode variable like this:
show variables like 'sql_mode';
… it will show you the sql_mode variable, that will be sth like this: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
You have to set up again sql_mode variable without
NO_ZERO_IN_DATE,NO_ZERO_DATE
So in the previous example you should set the sql_mode like this:
SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
Then check the sql_mode variable again to be sure it has changed correctly:
show variables like 'sql_mode';
Then the restriction is gone ;D
Found the solution here: https://stackoverflow.com/a/37696251/504910
вот такой запрос
CREATE TABLE `main_documents` (
`id` int(11) NOT NULL,
`employee_id` int(11) DEFAULT NULL,
`citizenship_id` int(11) DEFAULT NULL,
`document_type_id` int(11) DEFAULT NULL,
`first_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`last_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`middle_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`birthday` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`hometown` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`issue_date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`expiration_date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`gender` int(11) DEFAULT NULL,
`series` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`number` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`scan_id` int(11) DEFAULT NULL,
`issued_by` text COLLATE utf8_unicode_ci
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
выдает такую ошибку
#1067 — Invalid default value for ‘issue_date’
честно пытался гуглить но не смог понять в чем проблема
Перейти к содержимому
При импорте одной базы у меня начала выскакивать ошибка
ERROR 1067 (42000) at line 1623: Invalid default value for 'date_added'
а сама проблемная строка в дампе имела такой вид
`date_added` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'дата добавления страницы',
Оказалось, что такой вариант записи подходит для MySQL 5.6 и выше, а у меня на сервере оказалась древняя MySQL 5.1. (sic).
Решить эту проблему можно двумя способами.
Способ №1 — сменить тип поля DATETIME на TIMESTAMP
При таком варианте, запись
`date_added` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'дата добавления страницы',
становится православной и дамп импортируется корректно, однако TIMESTAMP отличается от DATETIME тем, что зависит от временной зоны (более подробные отличия тут
— https://habr.com/post/61391/) и новость выложенная условно в 2 часа ночи становится немного странной, поэтому
Способ №2 — добавить триггер при создании записи
Но перед добавлением самого триггера, в моем случае нужно было поставить какое-нибудь дефолтное значение для поля, потому что на 0 MySql сыпал варнингами, поэтому я поставил вот так «2018-01-10 16:35:38» — дата на самом деле не важна, главное чтоб она была :), а затем прописал такой триггер
drop trigger if exists `ocpm_information_date_added_created`; -- удаляем если он есть create trigger `ocpm_information_date_added_created` before insert -- создаем на событие before insert on `ocpm_information` -- имя таблицы for each row set new.`date_added` = now(); -- имя поля
и все заработало.
Вопрос:
Когда я попытался изменить таблицу, она показывает ошибку
ERROR 1067 (42000): Invalid default value for 'created_at'
i google для этой ошибки, но все, что я нашел, это если они пытались изменить временную метку, эта ошибка произошла, но здесь я пытаюсь добавить новый столбец, и я получаю эту ошибку.
mysql> ALTER TABLE investments ADD bank TEXT;
ERROR 1067 (42000): Invalid default value for 'created_at'
и моя таблица имеет последние два столбца created_at и updated_at
вот моя структура таблицы
Лучший ответ:
Проблема из-за 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';
Ответ №1
Просто перед запуском любых операторов поместите это в первую строку:
SET sql_mode = '';
Ответ №2
Попробуйте выполнить следующую команду:
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 не принимает вашу команду, поскольку значения для этих столбцов не могут быть нулевыми.
Надеюсь, что это поможет.
Ответ №3
Я столкнулся с той же ошибкой при попытке установить стороннюю базу данных.
Я попробовал решение, предложенное безуспешно, т.е. SET sql_mode = '';
Затем я попробовал команду ниже, которая работала, позволяя устанавливать базу данных
SET GLOBAL sql_mode = '';
Ответ №4
В моем случае у меня есть файл для импорта.
Поэтому я просто добавил SET sql_mode = ”; в начале файла, и он работает!
Ответ №5
У меня была аналогичная проблема. После этого он решил:
Изменить:
recollect_date TIMESTAMP DEFAULT 'CURRENT_TIMESTAMP',
в
recollect_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
то есть. просто удалите кавычки вокруг CURRENT_TIMESTAMP.
Надеюсь, это поможет кому-то.
Ответ №6
Вы можете сделать это следующим образом:
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 []>
Ответ №7
Запустите этот запрос:
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
он работает для меня
Ответ №8
Как уже упоминалось в ответе @Bernd Buffen. Это проблема с MariaDB 5.5, я просто обновляю MariaDB 5.5 до MariaDB 10.1 и проблема решена.
Вот шаги по обновлению MariaDB 5.5 до MariaDB 10.1 в CentOS 7 (64-разрядная версия)
-
Добавьте следующие строки в репозиторий 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
- Остановите MariaDB, если уже запущен
service mariadb stop
-
Выполнить обновление
yum update
-
Запуск MariaDB и выполнение обновления
service mariadb start
mysql_upgrade
Все готово.
Проверьте версию MariaDB: mysql -V
ПРИМЕЧАНИЕ. Всегда выполняйте резервное копирование баз данных перед выполнением обновлений. Данные могут быть потеряны, если обновление не удалось или что-то пошло не так.
Ответ №9
Для Mysql5.7 войдите в командную строку mysql и выполните команду: mysql> show variable вроде “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. Оно работает!
Ответ №10
SET GLOBAL sql_mode = '';
Решил мою проблему.
Ответ №11