поле mysql error 1364 не имеет значений по умолчанию
мой стол выглядит как
create table try ( name varchar(8), CREATED_BY varchar(40) not null);
и тогда у меня есть триггер для автоматического заполнения поля CREATED_BY
create trigger autoPopulateAtInsert BEFORE INSERT on try for each row set new.CREATED_BY=user();
когда я делаю вставку с помощью
insert into try (name) values ('abc');
запись в таблице, но я все еще получаю сообщение об ошибке
Field 'CREATED_BY' doesn't have a default value Error no 1364
есть ли способ подавить эту ошибку, не делая поле nullable и не удаляя триггер? В противном случае мой hibernate увидит эти исключения ( даже если были сделаны вставки) и тогда приложение рухнет.
13 ответов:
установить значение по умолчанию для
Created_By
(например: пустойVARCHAR
) и триггер будет обновлять значение в любом случае.
это вызвано
STRICT_TRANS_TABLES
режим SQL, определенный в. Удаление этого параметра и перезапуск MySQL должны устранить проблему.%PROGRAMDATA%\MySQL\MySQL Server 5.6\my.ini
если редактирование этого файла не устраняет проблему, см. http://dev.mysql.com/doc/refman/5.6/en/option-files.html для других возможных расположений конфигурационных файлов.
открыть phpMyAdmin и перейти на вкладку "Дополнительно" и выбрать подменю "переменные". Прокрутите вниз, чтобы найти режим SQL. Измените режим sql и удалите 'STRICT_TRANS_TABLES' Сохранить его.
когда у меня была такая же проблема с mysql5.6.20, установленной с Homebrew, я решил ее, войдя в мой.cnf
nano /usr/local/Cellar/mysql/5.6.20_1/my.cnf
найти строку, которая выглядит так:
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
комментарий выше строки и перезапустить сервер MySQL
mysql.server restart
ошибка ушла!
в phpmyadmin выполните следующие действия:
select @@GLOBAL.sql_mode
в моем случае, я получаю следующее:
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
скопируйте этот результат и удалить
STRICT_TRANS_TABLES
. Затем выполните следующие действия:set GLOBAL sql_mode='ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
его работа и проверенная копия в конфигурационный файл: / etc/mysql / my.cnf или /bin / mysql / my.ini
[mysqld] port = 3306 sql-mode=""
затем перезапустите MySQL
перед каждым действием вставки я добавил ниже строки и решил свою проблему,
SET SQL_MODE = '';
Я не уверен, что это лучшее решение,
SET SQL_MODE = ''; INSERT INTO `mytable` ( `field1` , `field2`) VALUES ('value1', 'value2');
Это, кажется, вызвано давно (С 2004 года) ошибка (#6295) в MySQL, под названием
триггеры не обрабатываются для столбцов NOT NULL.
это якобы было исправлено в версии 5.7.1 MySQL (Changelog, последняя запись) в 2013 году, заставляя MySQL вести себя как "в соответствии со стандартом SQL" (там же).
измените запрос и добавьте "игнорировать" как:
INSERT IGNORE INTO `mytable` ( `field1` , `field2`) VALUES ('value1', 'value2');
запустите консоль mysql, выберите база данных и запустите (также из консоли mysql):
SET GLOBAL sql_mode='';
это отключит строгий режим, и mysql больше не будет жаловаться.
как говорили другие, это вызвано
STRICT_TRANS_TABLES
режим SQL.чтобы проверить, является ли
STRICT_TRANS_TABLES
режим включен:SHOW VARIABLES LIKE 'sql_mode';
отключить "строгий режим":
SET GLOBAL sql_mode='';
Я установил поля не null и проблема решена, он обновляется, когда информация приказывается хранить в нем, больше не показывая сообщение msqli, что поле было пустым, потому что вы не вставляли в него значение, ну применение этого решения может работать на некоторых проектах зависит от вашей структуры проекта.