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

ক্ষেত্রটিকে অযোগ্য করে না দিয়ে এবং ট্রিগারটি অপসারণ না করে এই ত্রুটিটি দমন করার কোনও উপায় আছে কি? অন্যথায় আমার হাইবারনেট এই ব্যতিক্রমগুলি দেখতে পাবে (সন্নিবেশগুলি সত্ত্বেও) এবং তারপরে অ্যাপ্লিকেশন ক্রাশ হবে।

উত্তর:


28

Created_By(যেমন: খালি VARCHAR) এর জন্য একটি ডিফল্ট মান সেট করুন এবং ট্রিগার মানটি যাইহোক আপডেট করবে।

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

কিভাবে একটি জাভা প্রোগ্রামে একটি ডিফল্ট মান সেট করতে?
নাগারাজন শানমুগাথন

1
আপনার সারণির সংজ্ঞাতে একটি ডিফল্ট মান প্রয়োজন (টেবিল চেষ্টা করুন (নাম বর্ণচর (8) তৈরি করুন, CREATED_BY বার্চর (40) নষ্ট নয়))
কিনস্লেয়ারইওয়াই

এটি মূল সমস্যার সমাধান করে না। নীচে ফাইএক্সএক্স দ্বারা আরও বিস্তৃত উত্তর দেখুন।
csvan

3
@csvan Phyxx এর উত্তর হয় মূল কারণ সুরাহা না কারণ মূল কারণ মাইএসকিউএল মধ্যে একটি বাগ v5.7.1 সংশোধন ছিল - দ্বারা B98 উত্তর দেখুন: stackoverflow.com/a/29854279/5389997 সরানো হচ্ছে strict_trans_table SQL মোড মাইএসকিউএল আরো তোলে ডেটা মানের ত্রুটির ঝুঁকিতে পড়ে, তাই এটি অপসারণ করা আসলেই ভাল পরামর্শ নয়।
ছায়া

204

এটি এর মধ্যে STRICT_TRANS_TABLESসংজ্ঞায়িত এসকিউএল মোডের কারণে ঘটে

% প্রোগ্রামারডটা% \ মাইএসকিউএল \ মাইএসকিউএল সার্ভার 5.6 \ my.ini

ফাইল। সেটিংটি সরিয়ে এবং মাইএসকিউএল পুনরায় চালু করা সমস্যার সমাধান করা উচিত।

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
আপনি আপনার ডাটাবেস পরিচালনা সরঞ্জামের মধ্যে একটি এসকিউএল ক্যোয়ারী চালাতে পারেন, যেমন -- verified that the mode was previously set select @@GLOBAL.sql_mode; -- UPDATE MODE SET @@global.sql_mode= 'YOUR_VALUE';
পিএইচপিএমওয়াই অ্যাডমিন

5
তবে আপনি কি স্ট্রাইকT_TRANS_TABLES চান?
এন্ড্রু

আমার ক্ষেত্রে ক্ষেত্রটি NATL হিসাবে ডিফল্ট সেট সহ DATETIME টাইপের, এবং আমি এখনও একই ত্রুটি দেখতে পাচ্ছি, একই ডাটাবেসে আমার দুটি স্কিমা রয়েছে। স্টেজিংয়ের জন্য একটি, একই টেবিলে স্ট্রাকচার সহ উত্পাদনের জন্য অন্য। এটি একটি স্কিমাতে কাজ করে তবে উভয় ক্ষেত্রে একই টেবিল কাঠামোতে অন্যটিতে কাজ করে না। আমি বিস্মিত হই .. আমি নিশ্চিত নই যে এটি স্ট্রিকT_TRANS_TABLES- এর সাথে ইস্যু হয়েছে
ড্রিশ করুন

1
আমি /etc/my.cnf - থেকে sql_mode থেকে শুরু করা লাইনে STRICT_TRANS_TABLES সরিয়েছি - এবং মাইএসকিএল পরিষেবাটি পুনরায় আরম্ভ করেছি এবং সমস্যাটি চলে গেছে।
মাইক ভোলমার

92

Phpmyadmin খুলুন এবং 'আরও' ট্যাবটি যান এবং 'ভেরিয়েবলস' সাবমেনু নির্বাচন করুন। স্কয়ার মোডটি খুঁজতে নীচে স্ক্রোল করুন। এসকিএল মোড সম্পাদনা করুন এবং এটি সংরক্ষণ করুন 'STRICT_TRANS_TABLES' মুছে ফেলুন।


22
এই প্রশ্নটি মাইএসকিউএল সম্পর্কিত, এবং phpmyadmin সম্পর্কে কোনও উল্লেখ করে না। অনুমান করবেন না যে প্রত্যেকেরই এটি চলছে।
ক্রিস

2
@ jackadams49 এই পরিবর্তন আটকায় না। আপনি কি আমাকে পরামর্শ দিতে পারেন যে এই পরিবর্তনটি সিস্টেমের পুনরায় বুট থেকে বাঁচতে আপনি কী করেছিলেন?
এলডি জেমস

8
@ জ্যাকাড্যামস 49 এটিকে স্থির রাখতে, 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", সংরক্ষণ করতে এবং প্রস্থান করতে এবং sudo service mysql restart
মাইএসকিএল

1
যোগ করার জন্য, আমাকে sql_modeশূন্যের মানগুলি পরিবর্তন করতে হয়েছিল , sql_mode = ""অন্য অন্যান্য অনুরূপ ত্রুটির জন্য।
maan81

আমরা সম্প্রতি আমাদের মাইএসকিউএল 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 এ লগইন করতে হবে :) সুপার অ্যাকাউন্ট
ইউজার 889030

1
চার ঘন্টা ব্যয় করার পরে, এই সমাধানটি আমার জন্য উবুন্টু 16.04 এ কাজ করেছিল। দুর্দান্ত!
ওয়ালিদ আহমেদ

3
আপনার কোনও প্রয়োজন নেই phpmyadmin, mysqlকমান্ড লাইনে এই কমান্ডগুলি ব্যবহার করুন ।
gustyaquino

4
এটি mysql / সার্ভার / পিসি পুনরায় আরম্ভের পরে ডিফল্টে পুনরায় সেট হবে। আপনি সম্পাদনাটি /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 এ আপগ্রেড করার পরে আমার পক্ষে কাজ করে। ধন্যবাদ
ফ্রেডি কর্ডিয়ান

28

আমার যখন একই সমস্যাটি হোস্টব্রিউয়ের সাথে ইনস্টল করা মাইএসকিএল ৫.০.২০ ছিল, আমি আমার সিএনএফ এ গিয়ে সমাধান করেছি

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

দেখতে দেখতে লাইনটি সন্ধান করুন:

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

উপরের লাইনের বাইরে মন্তব্য করুন এবং মাইএসকিএল সার্ভার পুনরায় চালু করুন

mysql.server restart

ত্রুটি চলে গেল!


15

মাইএসকিএল কনসোল চালান:

mysql -u your_username -p

ডাটাবেস নির্বাচন করুন:

USE your_database;

এবং চালান (মাইএসকিএল কনসোল থেকেও):

SET GLOBAL sql_mode='';

এটি কঠোর মোডটি বন্ধ করে দেবে এবং মাইএসকিএল আর কোনও অভিযোগ করবে না।

বিষয়গুলি পরিষ্কার করার জন্য: আপনার ডাটাবেস সংজ্ঞাটি বলছে "এই ক্ষেত্রটির অবশ্যই ডিফল্ট মান সংজ্ঞায়িত হওয়া উচিত" এবং উপরের পদক্ষেপগুলি দ্বারা আপনি মাইএসকিএলকে "নেহা, কেবল এটিকে উপেক্ষা করুন" বলবেন। আপনি যদি স্থানীয়ভাবে কিছু দ্রুত সমাধান করতে চান তবে এই সমাধানটি ঠিক আছে। তবে সাধারণত আপনার আপনার ডাটাবেস সংজ্ঞাতে তদন্ত করতে হবে এবং ফিল্ডটির সত্যিকার অর্থে ডিফল্ট মান দরকার আছে কিনা তা পরীক্ষা করা উচিত। এবং যদি ডিফল্ট মানের প্রয়োজন না হয় তবে পরিষ্কার পরিস্থিতি থাকার জন্য এই প্রয়োজনীয়তাটি সরানো উচিত।


হ্যাঁ একটি ডিফল্ট যুক্ত করবেন না কেবল নিয়মগুলি মুছে ফেলুন, দুর্দান্ত সমাধান (বিদ্রূপযুক্ত) কখনই এটির দুর্দান্ত খারাপ উদাহরণটি করবেন না। এটি যদিও সমস্যার সমাধান করে
জারডিলিয়র

1
হ্যাঁ, আপনার সাথে একমত তবে কিছু সময় আপনি অন্য কারও লোকের প্রকল্প পেয়েছেন যা ভাল চলছে (যেমন কড়া মোড সেট করা নেই) এবং আপনি স্থানীয়ভাবে কাজ করে কিছু ছোট বৈশিষ্ট্য বা বাগফিক্স যুক্ত করতে চান। আপনি ড্রাগনদের সাথে লড়াই করতে চান না, কেবল সেই দ * এন জিনিসটিকে কাজ করতে। :)
মিলানজি

সেই দৃশ্যের জন্য আমি সম্মত
জর্ডিলিওর

@ জারডিলিয়র সমস্যা কি? নিয়মটি সরানো থাকলে কলামের ধরণের ভিত্তিতে ডিফল্ট মানটি নেওয়া হয় .. আমি এ সম্পর্কে কোনও ভুল দেখছি না: / কোনও কারণ ছাড়াই এই নিয়মটি বেশ কঠোর।
রিলোইক

1
মোটেও কঠোর নয়, এটি আপনাকে কেবল একটি ডিফল্ট ঘোষণা করতে বা একটি মান সরবরাহ করতে বাধ্য করে, কঠোর মোড কেবলমাত্র তার চেয়ে আরও বেশি কিছু কাজ করার জন্য কাজ করে, সুতরাং এটি অক্ষম করে, কলামে একটি ডিওল্ট ঘোষণার পরিবর্তে বা মানটি পাস করার পরিবর্তে সত্যই ভয়ঙ্কর is মোর আইন প্রোড। আপনি সেখানে
মাইএসকিএল

13

অন্যরা যেমন বলেছিল, এটিই এর কারণে ঘটে STRICT_TRANS_TABLES এসকিউএল মোডের ।

STRICT_TRANS_TABLESমোড সক্ষম কিনা তা পরীক্ষা করতে:

SHOW VARIABLES LIKE 'sql_mode';

কঠোর মোড অক্ষম করতে:

SET GLOBAL sql_mode='';

পরীক্ষার জন্য ভেরিয়েবল> sql_mode থেকে ম্যানুয়ালি "STRICT_TRANS_TABLES" সরানো হয়েছে এবং এটি কার্যকর হয়েছে!
প্রেমের পপটিয়া

1
আপনি আমার দিন বাঁচিয়েছেন।
উমরবিলাল

আমার জন্য দ্বিতীয় কমান্ড চালানোর পরে এবং sql_mode (1 ম কমান্ড) পরীক্ষা করার পরে এটি কিছুই করে না। এমনকি মাইএসকিএল পরিষেবা পুনরায় চালু করার পরেও। ডেবিয়ান 9
ট্রেইনোসিস

12

প্রতিটি sertোকানো ক্রিয়াকলাপের আগে আমি লাইনের নীচে যুক্ত করে আমার সমস্যাটি সমাধান করেছি,

SET SQL_MODE = '';

আমি নিশ্চিত নই যে এটিই সেরা সমাধান,

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

1
প্রতিটি সন্নিবেশের ক্রিয়া করার আগে এটি করার দরকার নেই, ডাটাবেসের সাথে সংযোগের ঠিক পরে আপনার স্ক্রিপ্টের শুরুতে এটি একবার করুন, এবং প্রতিটি সন্নিবেশ ক্যোয়ারিতে "ফিল্ডের ডিফল্ট মান নেই" ত্রুটি ছাড়া কাজ করবে।
হোসে কার্লোস পিএইচপি

এই সমাধানটি ঠিক আছে কারণ আপনার সারণী পরিবর্তন করতে হবে না (পরিবর্তনের জন্য অনেকগুলি ক্ষেত্র থাকতে পারে)।
জোসে কার্লোস পিএইচপি

11

এটির কাজ এবং পরীক্ষিত কপিরাইট ফাইলটিতে অনুলিপি করুন: /etc/mysql/my.cnf OR /bin/mysql/my.ini

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

তারপরে মাইএসকিউএল পুনরায় চালু করুন


9

আপনার ক্যোয়ারীটি সংশোধন করুন এবং "IGNORE" যুক্ত করুন:

INSERT IGNORE INTO  `mytable` (  `field1` ,  `field2`) VALUES ('value1',  'value2');

এটি আমার পক্ষে কাজ করেছে - আমার পিএইচপি স্ক্রিপ্টটি বাতিল হয়ে যাবে, তবে আইগনোরের সাথে এটি কেবল নতুন সারি বিজ্ঞাপন দেয়! এখন, আইজিএনরে পিএইচপি-এমওয়াইএসকিউএল কোয়েরিতে হার্ডকড করা কতটা "নিরাপদ"? আমি এটি নতুন "দিনের" জন্য সারিগুলিকে অটো-যুক্ত করতে ব্যবহার করি, যেখানে এর আগে এটি ছিল না
লেভিক

@ লিভচিক আপনি যখন আইজিএনওর ব্যবহার করেন, তারপরে ত্রুটির পরিবর্তে মাইএসকিউএল একটি সতর্কতা জারি করে পরিবর্তে ত্রুটি ঘটলে এবং কোনওভাবে এই নির্দেশনাটি সম্পূর্ণ করার চেষ্টা করবে: মাইসকি্লিটরিউটোরিয়র
স্টিফান

6

উইন্ডোজ ওয়্যাম্প সার্ভার ব্যবহারকারীদের জন্য:

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) দ্বারা শিরোনাম হয়েছে বলে মনে হচ্ছে

ট্রিগারগুলি নাল কলামগুলির জন্য প্রক্রিয়াজাত হয় না

এটি ২০১৩ সালে মাইএসকিউএল (চেঞ্জলগ, শেষ এন্ট্রি) সংস্করণে 7.7.১ সংশোধন করা হয়েছিল , মাইএসকিউএলকে "এসকিউএল স্ট্যান্ডার্ড অনুযায়ী" (আইবিড) হিসাবে আচরণ করে তোলে।


আমি 5.6 থেকে 5.7.11 এ আপগ্রেড করেছি এবং সমস্যাটি আমার জন্য স্থির করা হয়েছিল (এবং স্ট্রাইকT_TRANS_TABLES অপসারণ আমার পক্ষে কাজ করে না), তাই আমি এটিকে উত্সাহিত করছি এবং বাকী উত্তরগুলিকে নিম্নমানের করছি
নোকট

5
@knocte প্রত্যেকেই তার সিস্টেমে মাইএসকিউএল আপগ্রেড করতে পারে না, সুতরাং এটির পক্ষে পক্ষে নেমে যাওয়ার পক্ষে উপযুক্ত নয়।
জুলিয়েনড

একমাত্র উত্তর যা সত্যই আমাকে সাহায্য করে। NOT NULLসীমাবদ্ধতা অপসারণ বা কলামে ডিফল্ট মান যুক্ত করা সমস্যার সমাধান করে fixed ট্রিগার আশানুরূপ কাজ করে।
রুসলান স্টেলমাচেনকো

3

উইন্ডোজ সার্ভারে my.ini সম্পাদনা করুন (উদাহরণস্বরূপ প্রোগ্রাম ফাইলগুলি \ mysql \ mysql সার্ভার nn \ my.ini)

আমি কেবল এসকিএল-মোড = "" সেট করব না, বরং আমি পরামর্শ দিচ্ছি যে কেউ লাইনটি থেকে স্ট্রিক-এসটিআরটিএসটিএবিএলএস অপসারণ করবে, সবকিছু যেমন ছিল তেমনটি ছেড়ে দাও এবং তারপরে সার্ভিস ইউটিলিটি থেকে পুনরায় আরম্ভ করুন। আপনি কে এবং আপনি কী করেছেন ভবিষ্যতের প্রোগ্রামারদের জন্য একটি মন্তব্য যুক্ত করুন।


এই উত্তরটি একই বলে। stackoverflow.com/a/52004654/10431118
karma4917

সাধারণত হ্যাঁ বলছি, তবে আমার বক্তব্যটি হ'ল আমি বিশেষভাবে বলছি যে স্ক্যাল-মোডের সমস্ত মান ফাঁকা না করে বরং কেবলমাত্র স্ট্রিক এসটিআরটিএসএটিএসএবিএলএস অপসারণ করুন, যা আপনার প্রয়োজন কেবল। অন্যথায় আপনি অন্য কোনও পরিষেবাকে প্রভাবিত করতে পারেন।
বিল ডিগানান

1

আমি ক্ষেত্রগুলি শূন্য না হওয়ার এবং সমস্যার সমাধান করার জন্য সেট করেছি, এটি তথ্য সংরক্ষণ করার জন্য আদেশ দিলে এটি আপডেট হয়, আর এমএসকিলি বার্তাটি দেখায় না যে ক্ষেত্রটি খালি খালি কারণ আপনি এটিতে মান সন্নিবেশ করান নি, এই সমাধানটির প্রয়োগ কিছু ক্ষেত্রে কাজ করতে পারে প্রকল্পগুলি আপনার প্রকল্পের কাঠামোর উপর নির্ভর করে।


এটা তোলে কলামের পরিবর্তনের আমার ত্রুটি মীমাংসিত defaultথেকে অ্যাট্রিবিউট noneকরতে NULL। উচ্চ রেটিংয়ের উত্তর না থাকলে! আমি যখন ভেরিয়েবল sql_mode আপডেট করার চেষ্টা করতাম তখন আমার সিপ্যানেল ভাগ করে নেওয়া হোস্টিংয়ে আমাকে অ্যাক্সেস দিতে অস্বীকার করে।
রশিদ

0

আমি ডেটা ফোল্ডারে অবস্থিত my.ini ফাইল পরিবর্তন করার সমস্যার সমাধান করেছি। mysql 5.6 এর জন্য my.ini ফাইলটি বিন বা মাইএসকিএল ইনস্টলেশন ফোল্ডারের পরিবর্তে ডেটা ফোল্ডারে সরানো হয়েছে।


0

আমি মনে করি নাম কলামে এই ক্ষেত্রে নাল মান আছে।

update try set name='abc' where created_by='def';
  
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.