mysql error 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

Чи є спосіб придушити цю помилку, не роблячи поля нульовим І не знімаючи тригер? Інакше мій сплячий режим побачить ці винятки (навіть незважаючи на те, що вставки були зроблені), і тоді програма припинить роботу.

Відповіді:


28

Встановіть значення за замовчуванням для Created_By(наприклад: порожній VARCHAR), і тригер оновить значення в будь-якому випадку.

create table try ( 
     name varchar(8), 
     CREATED_BY varchar(40) DEFAULT '' not null
);

Як встановити значення за замовчуванням у програмі Java?
Nagarajan Shanmuganathan

1
вам потрібно значення за замовчуванням у визначенні таблиці (створити спробу таблиці (ім'я 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 SQL робить MySQL більш схильний до помилок в якості даних, тому видалення не є дійсно гарною порадою.
Тінь

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 про інші можливі місця розташування файлів конфігурацій.


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
оновити

1
Я вилучив STRICT_TRANS_TABLES з /etc/my.cnf - у рядку, що починається з sql_mode - і перезапустив службу mysql та проблему пішло.
Майк Вольмар

92

Відкрийте phpmyadmin та перейдіть на вкладку "Більше" та виберіть підменю "Змінні". Прокрутіть вниз, щоб знайти режим sql. Редагуйте режим sql та видаліть "STRICT_TRANS_TABLES" Збережіть його.


22
Це питання стосується MySQL і не згадує phpmyadmin. Будь ласка, не припускайте, що всі працюють так.
Кріс

2
@ jackadams49 Ця зміна не залишається. Чи можете ви порадити мені, що ви зробили, щоб ці зміни пережили перезавантаження системи?
ЛД Джеймс

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 акаунтами :) супер акаунт
user889030

1
витративши чотири години, це рішення працювало для мене в Ubuntu 16.04. Чудово!
Уелід Ахмед

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. спасибі
Фреді Кардіан

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 "так, просто ігноруйте його". Отже, якщо ви просто хочете зробити якийсь швидкий виправлення на місцях, це рішення нормально. Але, як правило, слід дослідити визначення вашої бази даних і перевірити, чи дійсно потрібне поле за замовчуванням і чи встановлено його. І якщо значення за замовчуванням не потрібне, цю вимогу слід усунути, щоб мати чисту ситуацію.


Так, не додайте за замовчуванням просто видаліть правила, чудове рішення (мається на увазі сарказм) ніколи не роби це чудовим поганим прикладом. Він вирішує питання, хоча
zardilior

1
Так, з вами згоден. Але колись у вас є проект інших людей, який працює добре, тобто на виробництві (де жорсткий режим не встановлений), і ви просто хочете додати якусь невелику функцію чи помилку, працюючи локально. Ви не хочете битися з драконами, аби зробити цю річ справою. :)
MilanG

по тому сценарію я згоден
zardilior

@zardilior в чому проблема? значення за замовчуванням вибирається на основі типу стовпця, якщо правило видалено .. Я не бачу в цьому нічого поганого: / це правило досить суворе без причини.
Релоек

1
Це зовсім не суворо, це просто змушує вас оголосити за замовчуванням або надати значення, також суворий режим працює на більшу кількість речей, ніж тільки це, тому його відключення, замість того, щоб оголосити про стовпчик у колонці або передати значення, справді жахливо mor ein прод. Ви відключите одну з хороших символів 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');

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
Стефан

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 .

Він нібито був зафіксований у версії 5.7.1 MySQL (Журнал змін, останній запис) у 2013 році, завдяки чому MySQL поводився як "згідно стандарту SQL" (там же).


Я оновив з 5.6 до 5.7.11, і для мене виправлено проблему (а видалення STRICT_TRANS_TABLES не працювало для мене), тому я підтримую цю заяву та забороняю решту відповідей
knocte

5
@knocte Не кожен може оновити MySQL у своїй системі, тому не варто заявляти на користь цього.
JulienD

Єдина відповідь, яка мені справді допомагає. Видалення NOT NULLобмеження або додавання значення за замовчуванням до стовпця вирішило проблему. Тригер працює як очікувалося.
Руслан Стельмаченко

3

У Windows Server відредагуйте my.ini (наприклад, програмні файли \ mysql \ mysql сервер nn \ my.ini)

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


Ця відповідь говорить те саме. stackoverflow.com/a/52004654/10431118
karma4917

Взагалі кажучи, так, але моя думка полягає в тому, що я конкретно говорю не видаляти всі значення sql-режиму, а скоріше видаляти лише STRICT_TRANS_TABLES, оскільки це все, що вам потрібно. Інакше ви можете вплинути на якусь іншу послугу.
Білл Деньян

1

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


Він вирішив мою помилку, змінивши defaultатрибут стовпця з noneна NULL. За винятком високих оцінок! мій cPanel надавав мені заборонений доступ до спільного хостингу, коли я намагався оновити змінну sql_mode.
Рашид

0

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


0

Я думаю, що в стовпці з іменами в цьому випадку є нульові значення.

update try set name='abc' where created_by='def';
  
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.