ত্রুটি 1067 (42000): 'তৈরি_্যাট' এর জন্য অবৈধ ডিফল্ট মান


102

আমি যখন টেবিলটি পরিবর্তন করার চেষ্টা করেছি তখন এটি ত্রুটিটি দেখিয়েছিল:

ERROR 1067 (42000): Invalid default value for 'created_at'

আমি এই ত্রুটিটি সম্পর্কে গুগল করেছি তবে আমার যা কিছু পাওয়া গেছে তা দেখে মনে হয়েছিল তারা টাইমস্ট্যাম্প পরিবর্তন করার চেষ্টা করেছিল যাতে এটি ঘটেছিল। তবে এখানে আমি একটি নতুন কলাম যুক্ত করার চেষ্টা করছি এবং আমি এই ত্রুটিটি পাচ্ছি:

mysql> ALTER TABLE investments ADD bank TEXT;
ERROR 1067 (42000): Invalid default value for 'created_at'

এবং আমার টেবিলের শেষ দুটি কলাম created_atএবং updated_at

এখানে আমার টেবিল কাঠামো:

এখানে চিত্র বর্ণনা লিখুন


এই কলামগুলির জন্য ডিফল্ট মানগুলি কী? আপনি কি টেবিল কাঠামো ভাগ করতে পারেন?
প্রিয়ংশু

@ প্রিয়াংশু আমি আমার টেবিলের কাঠামো আপডেট করেছি
iamsujit

4
শেষ দুটি কলামের জন্য ডিফল্ট মান বর্তমান_টাইমস্ট্যাম্প সেট করুন।
প্রিয়ংশু

উত্তর:


144

সমস্যাটি স্কয়ার_মোডের কারণে । কমান্ড দ্বারা আপনার বর্তমান sql_modes পরীক্ষা করুন:

show variables like 'sql_mode' ; 

এবং স্কেল_মোডটি " NO_ZERO_IN_DATE, NO_ZERO_DATE " এটিকে কাজ করতে সরান । এটি মাইএসকিএল নতুন সংস্করণগুলিতে ডিফল্ট sql_mode।

আপনি sql_mode কে বিশ্বব্যাপী কমান্ড দ্বারা রুট হিসাবে সেট করতে পারেন:

set global sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

7
আমি এটি জানি, তবে আমার সার্ভারে এসকিএল_মোড ফাঁকা দেখাচ্ছে, এখনও কাজ করছে না, আমি [সার্ভার সংস্করণ: 5.5.53-0ubuntu0.12.04.1 - (উবুন্টু)] ব্যবহার করছি। সার্ভার সংস্করণটি আপগ্রেড না করে যে কোনও একটির সমাধান হতে পারে?
প্রিয়ব্রত আট

আপনি গ্লোবাল কমান্ড দ্বারা পরীক্ষা করেছেন? এবং sql_mode তে কি একই সেশনের জন্য কিছুই নেই?
আমান আগরওয়াল

আমি 'sql_mode' এর মতো শো ভেরিয়েবলগুলি পরীক্ষা করেছি; এবং আউটপুটটি হল ভেরিয়েবল_নাম | মান = sql_mode |
প্রিয়ব্রত আট

4
এই উত্তরের জন্য উপযোগী হতে হবে stackoverflow.com/questions/2317650/...
Preshan Pradeepa

4
5.7 নিয়ে আমার পক্ষে কাজ করেননি। বিশ্বব্যাপী আমি এটি করতে হয়েছিল কিনা তা নিশ্চিত নয়।
ব্রেট

96

সহজভাবে, আপনি কোনও বিবৃতি চালানোর আগে এটি প্রথম লাইনে রাখুন:

SET sql_mode = '';

এটা ছিল দুর্দান্ত। ধন্যবাদ বন্ধু!
নোভাসল

7
টিপ জন্য ধন্যবাদ. তবে কেবল তারিখের সীমাবদ্ধতা NO_ZERO_IN_DATE,NO_ZERO_DATESET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
অপসারণই

4
স্পষ্টতার জন্য, এই বিবৃতিটি কেবলমাত্র উন্নয়নে নয়, উন্নয়নে ব্যবহার করা উচিত।
আহমেদ মোহাম্মদ

সহজ এবং সরল বিন্দু।
ফ্র্যাঙ্ক ফোটাংস

28

তৃতীয় পক্ষের ডাটাবেস ইনস্টল করার চেষ্টা করার সময় আমি একই ত্রুটিটি দেখতে পেয়েছি। আমি সমাধানটি ব্যর্থতার মতো প্রস্তাবিত করে চেষ্টা করেছি
SET sql_mode = '';

তারপরে আমি নীচের কমান্ডটি চেষ্টা করেছিলাম যা ডাটাবেস ইনস্টল করার অনুমতি দেয় worked
SET GLOBAL sql_mode = '';


4
SET sql_mode = '';এখন অবহেলিত হয়েছে, SET GLOBAL sql_mode = ''ঠিক আছে
ভাদিম আনিসিমভ

26

নিম্নলিখিত আদেশটি চেষ্টা করুন এবং চালনা করুন:

ALTER TABLE `investments` 
MODIFY created_at TIMESTAMP 
DEFAULT CURRENT_TIMESTAMP 
NOT NULL;

এবং

ALTER TABLE `investments` 
MODIFY updated_at TIMESTAMP 
DEFAULT CURRENT_TIMESTAMP 
NOT NULL;

আপনি এই ত্রুটিটি পাবার কারণ হ'ল আপনি created_atএবং updated_atক্ষেত্রগুলির জন্য কোনও ডিফল্ট মান সেট করছেন না । এই কলামগুলির মানগুলি শূন্য হতে পারে না বলে মাইএসকিউএল আপনার আদেশটি গ্রহণ করছে না।

আশাকরি এটা সাহায্য করবে.


4
ধন্যবাদ, উত্সাহিত, আমি আমার ব্যবহারের ক্ষেত্রে এই সমাধানটি পছন্দ করি
ক্রিসআর

5

আমার ক্ষেত্রে আমদানি করার জন্য আমার কাছে একটি ফাইল রয়েছে। সুতরাং আমি কেবল এসইটি sql_mode = '' যোগ করেছি; ফাইলের শুরুতে এবং এটি কাজ করে!



3

আপনি এটি এর মতো করতে পারেন:

 CREATE TABLE `ttt` (
  `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `t1` TIMESTAMP  NULL DEFAULT '0000-00-00 00:00:00',
  `t2` TIMESTAMP  NULL DEFAULT '0000-00-00 00:00:00',
  `t3` TIMESTAMP  NULL DEFAULT '0000-00-00 00:00:00',
  `t4` TIMESTAMP  NULL DEFAULT 0,
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
  • যেহেতু টাইমস্ট্যাম্প মানটি ইপচ সেকেন্ডস হিসাবে সঞ্চিত রয়েছে, টাইমস্ট্যাম্প মান '1970-01-01 00:00:00' (ইউটিসি) সংরক্ষিত আছে যেহেতু দ্বিতীয় # 0 ব্যবহৃত হয় '0000-00-00 00:00:00 উপস্থাপন করতে '।
  • মারিয়াডিবি 5.5-এ এবং তার আগে কেবলমাত্র প্রতি টেবিলে একটি TIMESTAMP কলাম থাকতে পারে যার CURRENT_TIMESTAMP তার ডিফল্ট মান হিসাবে সংজ্ঞায়িত হত। এই সীমাটি আর মারিয়াডিবি 10.0 এর পরে প্রয়োগ করা হয়নি।

দেখুন: https://mariadb.com/kb/en/mariadb/timestamp/

নমুনা

MariaDB []> insert into ttt (id) VALUES (1),(2),(3);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

MariaDB []> select * from ttt;
+----+---------------------+---------------------+---------------------+---------------------+
| id | t1                  | t2                  | t3                  | t4                  |
+----+---------------------+---------------------+---------------------+---------------------+
|  1 | 0000-00-00 00:00:00 | 2000-01-01 12:01:02 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
|  2 | 0000-00-00 00:00:00 | 2000-01-01 12:01:02 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
|  3 | 0000-00-00 00:00:00 | 2000-01-01 12:01:02 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
+----+---------------------+---------------------+---------------------+---------------------+
3 rows in set (0.00 sec)

MariaDB []>

3

আমারও একই সমস্যা ছিল নিম্নলিখিত এটি সমাধান:

পরিবর্তন:

recollect_date TIMESTAMP DEFAULT 'CURRENT_TIMESTAMP',

প্রতি:

recollect_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

অর্থাত শুধু চারপাশের কোট অপসারণ CURRENT_TIMESTAMP

আশা করি এটি কাউকে সাহায্য করবে।


3

@ বার্ড বাফেনের উত্তরে উল্লিখিত হিসাবে এটি মারিয়াডিবি 5.5 এর সাথে ইস্যু, আমি মারিয়াডিবি 5.5 কে মারিয়াডিবি 10.1 এ সহজ আপগ্রেড করেছি এবং সমস্যার সমাধান হয়েছে।

এখানে সেন্টোস 7 (64-বিট) এ মারিয়াডিবি 5.5 কে মারিয়াডিবি 10.1 এ উন্নীত করার পদক্ষেপগুলি

  1. মারিয়াডিবি রেপোতে নিম্নলিখিত লাইনগুলি যুক্ত করুন।

    nano /etc/yum.repos.d/mariadb.repo এবং নিম্নলিখিত লাইন আটকান

[mariadb]
নাম = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey = https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
রূপে ব্যবহৃত মান gpgcheck = 1

  1. ইতিমধ্যে চলমান থাকলে মারিয়াডিবি বন্ধ করুন service mariadb stop
  2. আপডেট সম্পাদন করুন

    yum update

  3. মারিয়াডিবি আর পারফর্মিং আপগ্রেড শুরু করা হচ্ছে

    service mariadb start

    mysql_upgrade

সবকিছু হয়ে গেল।

মারিয়াডিবি সংস্করণ পরীক্ষা করুন: mysql -V


দ্রষ্টব্য : আপগ্রেড করার আগে দয়া করে সর্বদা ডেটাবেস (গুলি) এর ব্যাকআপ নিন। আপগ্রেড ব্যর্থ হলে বা কিছু ভুল হয়ে থাকলে ডেটা হারিয়ে যেতে পারে।



2

কেবল এই লাইনে রূপান্তর করুন:

নতুন টেবিলের জন্য:

CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

বিদ্যমান সারণীর জন্য:

Alter ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

সূত্র :

https://dev.mysql.com/doc/refman/5.5/en/timestamp-initialization.html


2

Mysql5.7 এর জন্য, mysql কমান্ড লাইনে লগইন করুন এবং কমান্ডটি চালান,

mysql> show variables like 'sql_mode' ;

এটি স্কুল_মোডে NO_ZERO_IN_DATE, NO_ZERO_DATE দেখায়।

এখানে চিত্র বর্ণনা লিখুন

দুটি বিকল্প অপসারণ করতে আপনার মাইএসকিএল কনফিলাইট ফাইলে [মাইএসকিএলডি] এর নীচে একটি লাইন যুক্ত করার চেষ্টা করুন, আমার (উবুন্টু ১ on এর মাইএসকিএল ৫.7) হ'ল /etc/mysql/mysql.conf.d/mysqld.cnf

এখানে চিত্র বর্ণনা লিখুন

এখন মাইএসকিএল পুনরায় চালু করুন। এটি কাজ করে!


0

MySQL 8.0.18 এর জন্য:

CURRENT_TIMESTAMP([fsp])

"([Fsp])" সরান, আমার সমস্যার সমাধান করুন।


0
  1. প্রথমে, আপনার টার্মিনালে বিদ্যমান মোড (গুলি) নিম্নলিখিত কমান্ডটি ব্যবহার করছে তা পরীক্ষা করুন:

    $ mysql -u root -p -e "SHOW VARIABLES LIKE 'sql_mode';"

    বা

    mysql> show variables like 'sql_mode';

    আপনি নীচের মত একটি আউটপুট দেখতে পাবেন

    এখানে চিত্র বর্ণনা লিখুন

  2. My.cnf এর মাধ্যমে মোড (গুলি) অক্ষম করুন: এই ক্ষেত্রে আপনাকে NO_ZERO_IN_DATE, NO_ZERO_DATE মোডগুলি সরিয়ে ফেলতে হবে

    My.cnf ফাইলটি খুলুন (সাধারণত আপনি /etc/my.cnf অথবা /etc/mysql/my.cnf এ অবস্থিত my.cnf ফাইলটি খুঁজে পেতে পারেন)

    [mysqld]শিরোনামের অধীনে my.cnf এ মোডগুলি আপডেট করুন

    sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

    এখানে আমি NO_ZERO_IN_DATE, NO_ZERO_DATE মোড বাদ দিয়েছে

  3. মাইএসকিএল সার্ভার পুনরায় চালু করুন

    $ /etc/init.d/mysql restart

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.