mysql त्रुटि 1364 फ़ील्ड में डिफ़ॉल्ट मान नहीं है


113

मेरी टेबल लगती है

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

और फिर मेरे पास स्वत: निर्मित फ़ील्ड को पॉप्युलेट करने के लिए एक ट्रिगर है

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
);

जावा प्रोग्राम में डिफ़ॉल्ट मान कैसे सेट करें?
नागराजन शंमुगनाथन

1
आपको तालिका की परिभाषा में एक डिफ़ॉल्ट मान चाहिए (तालिका तालिका बनाएं (नाम varchar (8), CREATED_BY varchar (40) DEFAULT '' null नहीं))
KinSlayerUY

यह मूल समस्या को संबोधित नहीं करता है। नीचे Phyxx द्वारा अधिक व्यापक जवाब देखें।
सीएसवन

3
@csvan Phyxx का उत्तर मूल कारण को संबोधित नहीं करता है क्योंकि मूल कारण MySQL में एक बग था जो v5.7.1 में तय किया गया था - B98 द्वारा उत्तर देखें: stackoverflow.com/a/29854279/538992_trans_table SQLl मोड को हटाने से MySQL और अधिक हो जाता है डेटा गुणवत्ता त्रुटियों की संभावना है, इसलिए इसे हटाना वास्तव में अच्छी सलाह नहीं है।
छाया

205

यह STRICT_TRANS_TABLESSQL मोड में परिभाषित होने के कारण होता है

% PROGRAMDATA% \ MySQL \ MySQL सर्वर 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 चाहते हैं?
एंड्रयू

मेरे मामले में फ़ील्ड NAT के रूप में डिफ़ॉल्ट सेट के साथ DATETIME प्रकार की है, और मैं अभी भी एक ही त्रुटि देख रहा हूं, मेरे पास एक ही डेटाबेस पर दो स्कीमा हैं। एक मंचन के लिए, दूसरा उत्पादन के लिए, एक ही तालिका संरचनाओं के साथ। यह एक स्कीमा में काम करता है, लेकिन दोनों में एक ही तालिका संरचना के साथ दूसरे में काम नहीं करता है। मैं विस्मित कर रहा हूँ .. मुझे यकीन है कि यह STRICT_TRANS_TABLES साथ कोई समस्या है नहीं कर रहा हूँ
dresh

1
मैंने sql_mode से शुरू होने वाली लाइन में / / cc/my.cnf से STRICT_TRANS_TABLES हटा दिया - और mysql सेवा को पुनः आरंभ किया और समस्या दूर हो गई।
माइक वोल्मर

92

Phpmyadmin खोलें और 'More' टैब पर जाएं और 'Variables' सबमेनू चुनें। Sql मोड खोजने के लिए नीचे स्क्रॉल करें। Sql मोड को संपादित करें और 'STRICT_TRANS_TABLES' को निकालें।


22
यह प्रश्न MySQL के बारे में है, और यह phpmyadmin का कोई उल्लेख नहीं करता है। कृपया यह न समझें कि हर कोई दौड़ रहा है।
क्रिस

2
@ jackadams49 यह परिवर्तन छड़ी नहीं है। क्या आप मुझे सलाह दे सकते हैं कि इस बदलाव को पूरा करने के लिए आपने क्या किया है ताकि सिस्टम रिबूट बच जाए?
LD जेम्स

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नल के मूल्यों को बदलना पड़ा , अर्थात sql_mode = ""अन्य समान त्रुटियों के लिए।
मान .१

हमने हाल ही में अपने 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 में लॉगिन करना होगा :) सुपर अकाउंट
user889030

1
चार घंटे बिताने के बाद, इस समाधान ने मेरे लिए Ubuntu 16.04 में काम किया। महान !
वलीद अहमद

3
आपको इसकी आवश्यकता नहीं है phpmyadmin, mysqlकमांड लाइन पर इन कमांड का उपयोग करें ।
gustyaquino

4
यह mysql / server / pc पुनरारंभ के बाद डिफ़ॉल्ट पर रीसेट हो जाएगा। आप संपादित /etc/mysql/mysql.conf.d/mysqld.cnf करने की जरूरत है, और [mysqld] के बाद इस पंक्ति जोड़ें: = 'ONLY_FULL_GROUP_BY, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_UBSTITUTION' sql_mode
waza123

@ waza123 द्वारा समाधान, यह मेरे लिए mysql 5.7.20 में अपग्रेड करने के बाद काम करता है। धन्यवाद
fredy kardian

28

जब मुझे Homesw के साथ mysql5.6.20 के साथ यही समस्या थी, तो मैंने 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
हाँ, आपसे सहमत हूँ। लेकिन कभी-कभी आपको कुछ अन्य लोगों की परियोजना मिली, जो कि अच्छी तरह से चल रही है यानी उत्पादन पर (जहां सख्त मोड सेट नहीं है) और आप बस कुछ छोटे फीचर या बगफिक्स जोड़ना चाहते हैं, कार्यशील स्थानीय। आप ड्रेगन से लड़ना नहीं चाहते हैं, बस उस दा * n काम करने के लिए। :)
मिलन जी

उस परिदृश्य के लिए मैं सहमत हूं
जार्डिलियोर

@zardilior क्या समस्या है? डिफ़ॉल्ट मान को स्तंभ प्रकार के आधार पर चुना जाता है यदि नियम हटा दिया जाता है .. मुझे इसके बारे में कुछ भी गलत नहीं दिखता है: / यह नियम बिना किसी कारण के बहुत कठोर है।
रीलॉन्च

1
कठोर नहीं है, यह आपको केवल एक डिफ़ॉल्ट घोषित करने या एक मूल्य प्रदान करने के लिए मजबूर करता है, सख्त मोड भी उसी तरह से अधिक चीजों के लिए काम करता है, इसलिए इसे अक्षम करना, स्तंभ पर एक घोषणा घोषित करने या मूल्य पारित करने के बजाय, वास्तव में भयानक है मोर ईन ठेस। आप वहाँ mysql अच्छे वर्णों में से एक को निष्क्रिय करते हैं
zardilior

13

जैसा कि दूसरों ने कहा, यह STRICT_TRANS_TABLESSQL मोड के कारण होता है ।

यह जाँचने के लिए कि क्या STRICT_TRANS_TABLESमोड सक्षम है:

SHOW VARIABLES LIKE 'sql_mode';

सख्त मोड को अक्षम करने के लिए:

SET GLOBAL sql_mode='';

मैन्युअल रूप से "STRICT_TRANS_TABLES" को परीक्षण के लिए चर> sql_mode से हटा दिया गया और यह काम कर गया!
प्रेम पोपटिया

1
आपने मेरा दिन बचाया।
कुमारिललाल

मेरे लिए दूसरी कमांड चलाने और sql_mode (1 कमांड) की जाँच करने के बाद यह कुछ नहीं करता है। Mysql सेवा को पुनरारंभ करने के बाद भी। डेबियन 9
ट्रिनोसिस

12

प्रत्येक सम्मिलित क्रिया से पहले मैंने नीचे की पंक्ति को जोड़ा और अपनी समस्या हल की,

SET SQL_MODE = '';

मुझे यकीन नहीं है कि यह सबसे अच्छा समाधान है,

SET SQL_MODE = ''; INSERT INTO  `mytable` (  `field1` ,  `field2`) VALUES ('value1',  'value2');

1
यह करने की आवश्यकता नहीं है कि हर डालने की क्रिया से पहले, बस एक बार अपनी स्क्रिप्ट की शुरुआत में, डेटाबेस से कनेक्ट होने के बाद, और हर सम्मिलित क्वेरी "फ़ील्ड के बिना एक डिफ़ॉल्ट मान नहीं" त्रुटि के साथ काम करेगी।
जोस कार्लोस PHP

यह समाधान ठीक है क्योंकि आपको तालिकाओं में परिवर्तन करने की आवश्यकता नहीं है (परिवर्तन के लिए बहुत सारे क्षेत्र हो सकते हैं)।
जोस कार्लोस PHP

11

इसके काम और परीक्षण की प्रतिलिपि विन्यास फाइल में: /etc/mysql/my.cnf OR /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 में , शीर्षक

ट्रिगर नहीं पूर्ण स्तंभों के लिए संसाधित नहीं किए जाते हैं

यह कथित रूप से 2013 में MySQL (चांगेलॉग, अंतिम प्रविष्टि) के संस्करण 5.7.1 में तय किया गया था , जिससे MySQL "SQL मानक" (ibid) के अनुसार व्यवहार करता है।


मैंने 5.6 से 5.7.11 तक उन्नयन किया और समस्या मेरे लिए तय की गई थी (और मेरे लिए STRICT_TRANS_TABLES को हटाने का काम नहीं किया), इसलिए मैं इसे बढ़ा रहा हूं और बाकी जवाबों को दरकिनार कर रहा हूं
knoctor

5
@knocte हर कोई अपने सिस्टम पर MySQL को अपग्रेड नहीं कर सकता है, इसलिए यह इसके पक्ष में नहीं है।
जुलिएनड

एकमात्र उत्तर जो वास्तव में मेरी मदद करता है। NOT NULLबाधा हटाने या कॉलम में डिफ़ॉल्ट मान जोड़ने से समस्या ठीक हो गई। ट्रिगर उम्मीद के मुताबिक काम करता है।
रुस्लान Stelmachenko

3

Windows सर्वर में my.ini संपादित करें (उदाहरण के लिए प्रोग्राम फाइलें \ mysql \ mysql सर्वर nn \ my.ini)

मैं केवल sql-mode = "" सेट नहीं करूंगा, बल्कि मैं सुझाव देता हूं कि कोई व्यक्ति लाइन से STRICT_TRANS_TABLES निकालता है, जैसे कि सब कुछ छोड़ देता है, और फिर सेवाओं की उपयोगिता से MySQL पुनः आरंभ करता है। भविष्य के प्रोग्रामर के लिए एक टिप्पणी जोड़ें कि आप कौन हैं और आपने क्या किया है।


यह उत्तर वही बताता है। stackoverflow.com/a/52004654/10431118
कर्म

आम तौर पर हाँ बोलते हुए, लेकिन मेरा कहना यह है कि मैं विशेष रूप से sql-mode के सभी मानों को खाली करने के लिए नहीं कह रहा हूँ, बल्कि केवल STRICT_TRANS_TABLES को हटाने के लिए, जैसा कि आप सभी की आवश्यकता है। अन्यथा आप किसी अन्य सेवा को प्रभावित कर सकते हैं।
बिल डेगन

1

मैंने फ़ील्ड्स को शून्य और समस्या हल नहीं करने के लिए सेट किया है, यह अद्यतन करता है जब एक जानकारी को इसमें संग्रहीत करने की आज्ञा दी जाती है, कोई और नहीं दिखा रहा है msqli संदेश है कि फ़ील्ड खाली cus था जिसे आपने इसके लिए मान सम्मिलित नहीं किया था, इस समाधान का अच्छा अनुप्रयोग कुछ पर काम कर सकता है परियोजनाएं आपकी परियोजना संरचना पर निर्भर करती हैं।


इसने कॉलम की defaultविशेषता को बदलकर मेरी त्रुटि को हल कर noneदिया NULL। जब तक उच्च रेटिंग जवाब नहीं! जब मैंने चर sql_mode को अपडेट करने की कोशिश की तो मेरा cPanel साझा होस्टिंग पर मुझे प्रवेश से वंचित कर रहा था।
राशिद

0

मैंने डेटा फ़ोल्डर में स्थित my.ini फ़ाइल को बदलने की समस्या को हल किया। mysql 5.6 के लिए my.ini फ़ाइल बिन या mysql स्थापना फ़ोल्डर के बजाय डेटा फ़ोल्डर में चली गई।


0

मुझे लगता है कि नाम के कॉलम में इस मामले में अशक्त मूल्य हैं।

update try set name='abc' where created_by='def';
  
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.