Ошибка mysql 1364 Поле не имеет значений по умолчанию

113

Моя таблица выглядит как

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

Есть ли способ подавить эту ошибку, не делая поле обнуляемым И без удаления триггера? В противном случае мой спящий режим увидит эти исключения (даже если вставки были сделаны), и тогда приложение выйдет из строя.

kk1957
источник

Ответы:

28

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

create table try ( 
     name varchar(8), 
     CREATED_BY varchar(40) DEFAULT '' not null
);
KinSlayerUY
источник
Как установить значение по умолчанию в программе на Java?
Nagarajan Shanmuganathan
1
вам нужно значение по умолчанию в определении таблицы (create table try (name varchar (8), CREATED_BY varchar (40) DEFAULT '' not null))
KinSlayerUY
Это не решает основную проблему. См. Гораздо более подробный ответ Phyxx ниже.
csvan
3
Ответ @csvan Phyxx не затрагивает основную причину либо потому, что основной причиной была ошибка в MySQL, которая была исправлена ​​в v5.7.1 - см. ответ B98: stackoverflow.com/a/29854279/5389997 Удаление режима strict_trans_table делает MySQL более подвержены ошибкам качества данных, поэтому их удаление - не лучший совет.
Shadow
205

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

Phyxx
источник
5
Вы можете запустить SQL-запрос с помощью инструмента управления базой данных, такого как phpMyAdmin: -- verified that the mode was previously set select @@GLOBAL.sql_mode; -- UPDATE MODE SET @@global.sql_mode= 'YOUR_VALUE';
anasanjaria
5
но, может быть, вы хотите STRICT_TRANS_TABLES?
Эндрю
в моем случае поле имеет тип DATETIME со значением по умолчанию NULL, и я все еще вижу ту же ошибку, у меня есть две схемы в одной базе данных. один для постановки, другой для производства, с теми же структурами таблиц. Он работает в одной схеме, но не работает в другой с точно такой же структурой таблиц в обеих. Я сбит с толку .. Я не уверен, что это проблема STRICT_TRANS_TABLES
dresh 01
1
Я удалил STRICT_TRANS_TABLES из /etc/my.cnf - в строке, начинающейся с sql_mode - и перезапустил службу mysql, и проблема исчезла.
Майк Волмар
92

Откройте phpmyadmin, перейдите на вкладку «Еще» и выберите подменю «Переменные». Прокрутите вниз, чтобы найти режим sql. Отредактируйте режим sql и удалите STRICT_TRANS_TABLES. Сохраните его.

Нилеш Дхангаре
источник
22
Этот вопрос касается MySQL и не упоминает phpmyadmin. Пожалуйста, не думайте, что это работает у всех.
Крис
2
@ jackadams49 Это изменение не сохраняется. Не могли бы вы посоветовать мне, что вы сделали, чтобы это изменение сохранилось после перезагрузки системы?
LD James
8
@ jackadams49, чтобы он оставался, sudo nano /etc/mysql/my.cnfдобавить [mysqld] sql_mode = "ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION", сохранить, выйти и перезапустить mysql sudo service mysql restart
maan81
1
Чтобы добавить, мне пришлось изменить значения sql_modeна null, т.е. sql_mode = ""на другие похожие ошибки.
maan81
Недавно мы обновили MySQL до версии 5.7. У нас было слишком много проблем. Это сработало для меня. Спас мой день.
Ученик
38

В 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'
Камиль
источник
да, но для этого вам нужно будет войти в phpmyadmin с учетной записью root :) super account
user889030
1
после четырех часов это решение сработало для меня в Ubuntu 16.04. Большой !
Waleed Ahmed
3
вам совсем не нужно phpmyadmin, используйте эти команды в mysqlкомандной строке.
gustyaquino
4
это будет сброшено на значение по умолчанию после перезапуска mysql / server / pc. Вы должны редактировать /etc/mysql/mysql.conf.d/mysqld.cnf, и после того, как [туздЫ] добавить следующую строку: sql_mode = 'ONLY_FULL_GROUP_BY, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_UBSTITUTION'
waza123
решение @ waza123, это работает для меня после обновления до mysql 5.7.20. спасибо
fredy kardian
28

Когда у меня была такая же проблема с mysql5.6.20, установленным с Homebrew, я решил ее, зайдя в my.cnf

nano /usr/local/Cellar/mysql/5.6.20_1/my.cnf

Найдите строку, которая выглядит так:

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

Прокомментируйте строку выше и перезапустите сервер mysql

mysql.server restart

Ошибка исчезла!

Кингсли Иджома
источник
15

Запустите консоль mysql:

mysql -u your_username -p

, выберите базу данных:

USE your_database;

и запустите (также из консоли mysql):

SET GLOBAL sql_mode='';

Это отключит строгий режим, и mysql больше не будет жаловаться.

Чтобы прояснить ситуацию: в определении вашей базы данных говорится, что «это поле должно иметь значение по умолчанию», и, выполняя шаги, указанные выше, вы говорите MySql «нет, просто игнорируйте его». Так что, если вы просто хотите быстро исправить ситуацию локально, это решение подойдет. Но обычно вам следует изучить определение своей базы данных и проверить, действительно ли поле требует значения по умолчанию, и если да, установите его. И если значение по умолчанию не требуется, это требование следует убрать, чтобы ситуация была чистой.

MilanG
источник
Да, не добавляйте значение по умолчанию, просто удалите правила, отличное решение (подразумевается сарказм), никогда не делайте этого, отличный плохой пример. Но это решает проблему
зардилиор
1
Да, согласен с тобой. Но когда-нибудь у вас есть какой-то чужой проект, который хорошо работает, например, в продакшене (где строгий режим не установлен), и вы просто хотите добавить небольшую функцию или исправление, работающее локально. Вы не хотите сражаться с драконами, просто чтобы заставить эту чертову штуку работать. :)
MilanG 09
для этого сценария я согласен
zardilior
@zardilior в чем проблема? значение по умолчанию выбирается на основе типа столбца, если правило удалено .. Я не вижу в этом ничего плохого: / это правило довольно жесткое без всякой причины.
Reloecc,
1
Совсем не суровый, он просто заставляет вас объявить значение по умолчанию или предоставить значение, а также строгий режим работает для большего, чем только это, поэтому его отключение вместо объявления дефолта в столбце или передачи значения действительно ужасно mor ein prod. Вы отключаете там один из хороших символов mysql
zardilior
13

Как говорили другие, это вызвано STRICT_TRANS_TABLESрежимом SQL.

Чтобы проверить, STRICT_TRANS_TABLESвключен ли режим:

SHOW VARIABLES LIKE 'sql_mode';

Чтобы отключить строгий режим:

SET GLOBAL sql_mode='';
Дамьян Павлица
источник
Вручную удалил "STRICT_TRANS_TABLES" из переменных> sql_mode для тестирования, и это сработало!
Prem popatia
1
Ты спас мне день.
umarbilal
Для меня после запуска второй команды и проверки sql_mode (1-я команда) он ничего не делает. Даже после перезапуска службы mysql. Debian 9
trainoasis
12

Перед каждым действием вставки я добавил строку ниже и решил свою проблему,

SET SQL_MODE = '';

Я не уверен, что это лучшее решение,

SET SQL_MODE = ''; INSERT INTO  `mytable` (  `field1` ,  `field2`) VALUES ('value1',  'value2');
Vinith
источник
1
Нет необходимости делать это перед каждым действием вставки, просто сделайте это один раз в начале вашего скрипта, сразу после подключения к базе данных, и каждый запрос вставки будет работать без ошибки «Поле не имеет значения по умолчанию».
Хосе Карлос PHP
Это подходящее решение, потому что вам не нужно изменять таблицы (может потребоваться изменить много полей).
Хосе Карлос PHP
11

Его работа и проверенная копия в файл конфигурации: /etc/mysql/my.cnf ИЛИ /bin/mysql/my.ini

[mysqld]
port = 3306
sql-mode=""

затем перезапустите MySQL

Деврадж Гупта
источник
9

Измените свой запрос и добавьте IGNORE как:

INSERT IGNORE INTO  `mytable` (  `field1` ,  `field2`) VALUES ('value1',  'value2');
Рохит Диман
источник
это сработало для меня - мой скрипт PHP прервался, но с IGNORE он просто объявляет новую строку! Насколько «безопасно» жестко запрограммировать IGNORE в запрос PHP-MYSQL? Я использую это для автоматического добавления строк для нового «дня», где его раньше не было
Левчик
@Levchik Когда вы используете IGNORE, тогда вместо ошибки MySQL выдает предупреждение, когда происходит ошибка, и пытается каким-то образом выполнить инструкцию: mysqltutorial.org/mysql-insert-ignore
Stefan
6

Для пользователей Windows WampServer :

WAMP> MySQL> my.ini

искать файл для sql-mode=""

Раскомментируйте это.

Андрей
источник
2
В моей версии пришлось поменять: sql-mode="STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"sql-mode="STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"на sql-mode="". Раскомментирование sql-mode=""вызвало ошибку.
Джулиан
5

По всей видимости, это вызвано давней (с 2004 г.) ошибкой (# 6295) в MySQL под названием

Триггеры не обрабатываются для столбцов NOT NULL .

Утверждается, что это было исправлено в MySQL версии 5.7.1 (журнал изменений, последняя запись) в 2013 году, что заставило MySQL вести себя как «в соответствии со стандартом SQL» (там же).

B98
источник
Я обновился с 5.6 до 5.7.11, и проблема была исправлена ​​для меня (и удаление STRICT_TRANS_TABLES у меня не сработало), поэтому я голосую за это и против остальных ответов
knocte
5
@knocte Не каждый может обновить MySQL в своей системе, поэтому голосовать против этого не стоит.
JulienD
Единственный ответ, который мне действительно помог. Удаление NOT NULLограничения или добавление значения по умолчанию в столбец устранило проблему. Триггер работает должным образом.
Руслан Стельмаченко
3

В Windows Server отредактируйте my.ini (например, программные файлы \ mysql \ mysql server nn \ my.ini)

Я бы не стал просто устанавливать sql-mode = "", скорее предлагаю удалить STRICT_TRANS_TABLES из строки, оставить все как было, а затем перезапустить MySQL из служебной утилиты. Добавьте комментарий для будущих программистов, кто вы и чем занимались.

Билл Дегнан
источник
Этот ответ говорит о том же. stackoverflow.com/a/52004654/10431118
karma4917 03
Вообще говоря, да, но я хочу сказать, что я специально говорю не вычеркивать все значения sql-mode, а скорее удалять только STRICT_TRANS_TABLES, поскольку это все, что вам нужно. В противном случае вы можете повлиять на другую службу.
Билл Дегнан,
1

Я установил для полей значение не null, и проблема решена, он обновляется, когда информация запрошена для хранения в нем, больше не отображается сообщение msqli о том, что поле было пустым, потому что вы не вставили в него значение, ну, применение этого решения может работать на некоторых проекты зависят от структуры вашего проекта.

ExploreTech
источник
Он решил мою ошибку, изменив defaultатрибут столбца с noneна NULL. Если только не высокие рейтинговые ответы! моя cPanel давала мне отказ в доступе на общем хостинге, когда я пытался обновить переменную sql_mode.
Рашид
0

Я решил проблему с изменением файла my.ini, расположенного в папке данных. для mysql 5.6 файл my.ini перемещен в папку данных, а не в папку установки bin или mysql.

Садик Кескин
источник
0

Я думаю, что в этом случае в столбце имени есть нулевые значения.

update try set name='abc' where created_by='def';
  
Сасинду
источник