поле 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 75

13 ответов:

установить значение по умолчанию для Created_By (например: пустой VARCHAR) и триггер будет обновлять значение в любом случае.

это вызвано STRICT_TRANS_TABLES режим SQL, определенный в

%PROGRAMDATA%\MySQL\MySQL Server 5.6\my.ini

. Удаление этого параметра и перезапуск MySQL должны устранить проблему.

см https://www.farbeyondcode.com/Solution-for-MariaDB-Field--xxx--doesn-t-have-a-default-value-5-2720.html

если редактирование этого файла не устраняет проблему, см. 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" (там же).

Для Windows WampServer потребители:

WAMP > MySQL > my.ini

поиск sql-mode=""

раскомментировать его.

измените запрос и добавьте "игнорировать" как:

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, что поле было пустым, потому что вы не вставляли в него значение, ну применение этого решения может работать на некоторых проектах зависит от вашей структуры проекта.