'Create_date' টাইমস্ট্যাম্প ক্ষেত্রের জন্য অবৈধ ডিফল্ট মান


186

আমার কাছে নীচের স্ক্য্যল তৈরির বিবৃতি রয়েছে

mysql> CREATE  TABLE IF NOT EXISTS `erp`.`je_menus` (
    ->   `id` INT(11) NOT NULL AUTO_INCREMENT ,
    ->   `name` VARCHAR(100) NOT NULL ,
    ->   `description` VARCHAR(255) NOT NULL ,
    ->   `live_start_date` DATETIME NULL DEFAULT NULL ,
    ->   `live_end_date` DATETIME NULL DEFAULT NULL , 
    ->   `notes` VARCHAR(255) NULL ,
    ->   `create_date` TIMESTAMP NOT NULL DEFAULT  '0000-00-00 00:00:00',
    ->   `created_by` INT(11) NOT NULL ,
    ->   `update_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP  ,
    ->   `updated_by` INT(11) NOT NULL , 
    ->   `status` VARCHAR(45) NOT NULL ,
    ->   PRIMARY KEY (`id`) ) 
    -> ENGINE = InnoDB;

নিম্নলিখিত ত্রুটি প্রদান

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

এখানে ত্রুটি কী?


আমি আপনার প্রশ্নের সাথে কিছু ভুল দেখতে পাচ্ছি না এবং এটি 5.1.50-সম্প্রদায়ের সবেমাত্র পরীক্ষিত হয়ে কাজ করে।
জসপ্রীত চাহাল

কোয়েরিটি আমার শেষদিকেও ঠিক আছে।
শক্তি সিং

শিওর নয় তবে সেই ক্ষেত্রে আলাদা নাম দিন এবং চেষ্টা করবেন?
নবীন কুমার

আমি উবুন্টু 10.04 এ mysql 5.1.56 সম্প্রদায়টি ব্যবহার করি। এবং কাজ করছে না
রবার্ট

5
শূন্যের কোনও তারিখের জন্য একটি তারিখের প্রয়োজন নেই। '1970-01-01 00:00:01' ব্যবহার করুন। [এখান থেকে নেওয়া] [১] [১]: dba.stackexchange.com/questions/6171/…
জাদেয়

উত্তর:


176

এটি সার্ভার এসকিউএল মোডের কারণে - NO_ZERO_DATE

উল্লেখ থেকে: NO_ZERO_DATE- কঠোর মোডে, '0000-00-00'একটি বৈধ তারিখ হিসাবে অনুমতি দেবেন না । আপনি এখনও আইজিএনওর বিকল্পের সাথে শূন্য তারিখ সন্নিবেশ করতে পারেন can যখন কঠোর মোডে না থাকে, তারিখটি গ্রহণ করা হয় তবে একটি সতর্কতা উত্পন্ন হয়।


19
আমি কীভাবে উপেক্ষা করব?
রবার্ট

9
আপনি এই বিকল্পটি উপেক্ষা করতে পারবেন না। এটি সার্ভার অপশন। আপনার যদি my.ini (মাইএসকিএল কনফিগারেশন ফাইল) অ্যাক্সেস থাকে তবে স্কেল-মোড বিকল্প থেকে NO_ZERO_DATE সরিয়ে সার্ভার পুনরায় চালু করুন।
ডিভার্ট

7
এই বিকল্পটি পরীক্ষা করতে - দেখান ভেরিয়েবলগুলি 'sql_mode' পছন্দ করুন
ডিভার্ট

6
আমি স্ক্রিপ্টটি মাইএসকিএল ওয়ার্কবেঞ্চ ব্যবহার করে তৈরি করেছি। স্ক্রিপ্টে স্কেল_মোডটি প্রচলিত to আমি যদি চিরাচরিত অপসারণ করি তবে স্ক্রিপ্টটি কাজ করে।
রবার্ট

17
মাইএসকিউএল ওয়ার্কবেঞ্চ পছন্দসমূহে, 'মডেল: মাইএসকিউএল' ট্যাবে যান। "উত্পাদিত স্ক্রিপ্টগুলিতে ব্যবহারের জন্য 'এসকিউএল_এমওডি' সেট করে" স্ট্রিকসT_TRANS_TABLES, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION "যা ভালোর জন্য সমস্যার সমাধান করে।
স্যাডডডেক

140

আপনি যদি স্ক্রিপ্টটি মাইএসকিউএল ওয়ার্কবেঞ্চ থেকে তৈরি করেন।

নিম্নলিখিত লাইন উত্পন্ন হয়

SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

SQL_MODE থেকে ট্র্যাডিশনাল সরান এবং তারপরে স্ক্রিপ্টটি ঠিকঠাক কাজ করা উচিত

অন্যথায়, আপনি এসকিউএল_মোডিকে অবৈধ তারিখের অনুমতি হিসাবে সেট করতে পারেন

SET SQL_MODE='ALLOW_INVALID_DATES';

1
কেন এটি কাজ করছে না তা অনুসন্ধান করার জন্য আমাকে কিছুটা সময়
বাঁচিয়েছে

5
আহ্ আপনাকে ধন্যবাদ এসকিউএল_মোডি = 'ALLOW_INVALID_DATES' সেট করুন; জীবন রক্ষাকারী ছিল আমি যখন অন্য ওয়ার্ডপ্রেসে কোনও ওয়ার্ডপ্রেস সাইট মাইগ্রেট করার চেষ্টা করছিলাম তখনই আমার এই সমস্যা হয়েছিল (উভয় স্থানীয়) এবং এই ত্রুটির সাথে সারণীতে কোনও সারি না থাকা সত্ত্বেও এটি আমাকে এই ত্রুটির কারণে ডাটাবেস ডেটা আমদানি করতে দেয় না।
মিকাতো

মোহন মত কাজ! ধন্যবাদ.
moreirapontocom

52

টাইমস্ট্যাম্পের '1970-01-01 00:00:01' ইউটিসি থেকে '2038-01-19 03:14:07' ইউটিসি ( দস্তাবেজ দেখুন ) এর ব্যাপ্তি রয়েছে । ডিফল্ট মানটি অবশ্যই এই ব্যাপ্তির মধ্যে থাকা উচিত।

অন্যান্য বিজোড়, সম্পর্কিত, আচরণ:

CREATE TABLE tbl1 (
    ts TIMESTAMP);  
Query OK, 0 rows affected (0.01 sec)

CREATE TABLE tbl2 (
    ts TIMESTAMP,
    ts2 TIMESTAMP);
ERROR 1067 (42000): Invalid default value for 'ts2'

CREATE TABLE tbl3 (
    ts TIMESTAMP,
    ts2 TIMESTAMP DEFAULT '1970-01-01 00:00:01');
Query OK, 0 rows affected (0.01 sec)

পার্শ্ব নোট, আপনি নাল inোকাতে চাইলে:

CREATE TABLE tbl4 (
    ts TIMESTAMP NULL DEFAULT NULL);

1
এটা আমার সাথে ঘটছে। Wth চলছে? ts2 এমনকি "নট নল" নয় ...!
পেড্রোড

2
হতে পারে কারণ "যদি আপনি কোনও টেবিলের প্রথম TIMESTAMP কলামের জন্য মান নির্ধারণ না করেন, মারিয়াডবি প্রশ্নযুক্ত সারিটিতে একটি আপডেট বা INSERT কোয়েরি করার সময় স্বয়ংক্রিয়ভাবে এটিকে বর্তমান তারিখ এবং সময় নির্ধারণ করবে" " - মারিয়াডিবি ডক্স
jsphpl

1
আমি এর ব্যবহার পছন্দ করি column_name TIMESTAMP DEFAULT NOW()। প্রতিটি পরিস্থিতির জন্য উপযুক্ত নাও হতে পারে তবে ভেবেছি আমি ভাগ করে নেব যেহেতু আমিও এটির সাথে ডিল করছি।
দেইজকেশিউজ

1
কলাম_নাম টাইমস্ট্যাম্প চ্যালেঞ্জ '1970-01-01 00:00:01' আমার জন্য কৌশলটি করেছে। ধন্যবাদ!
মেটাফা

41

উবুন্টু ডেস্কটপে 16.04 এ, আমি এটি করেছি:

  1. ফাইল খুলুন: /etc/mysql/mysql.conf.d/mysqld.cnfআপনার পছন্দসই একটি সম্পাদক এ।

  2. অনুসন্ধান করুন: sql_modeএটি কোথাও কোথাও থাকবে [mysqld]

  3. এবং sql_modeনিম্নলিখিততে সেট করুন:

    NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

  4. ম্যাসকিউএল পরিষেবা সংরক্ষণ করে পুনরায় চালু করুন:

    sudo service mysql restart


8
এটি সাহায্য করেছিল, sql_modeউবুন্টু 16.04-তে আমার এসকিউএল-এর উদাহরণের জন্য সেখানে ছিল না except "NO_ZERO_DATE" মুছে ফেলাতে আমাকে ফাইলটিতে এর জন্য একটি এন্ট্রি যুক্ত করতে হয়েছিল। No_zero_date sql_mode = ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION পরিত্রাণ পেতে লাইনের নিচে #Adding: তাই, এখানে কিভাবে এটি এখন দেখায়
OK999

আপনি ঠিক বলেছেন .. আমি যুক্ত করেছি যে এর আগে কঠোর মোডটি অক্ষম করার জন্য .. এবং আমি যখন এই নির্দিষ্ট সমস্যার জন্য এটি সম্পাদনা করি তখন প্রবেশটি sql_modeইতিমধ্যে ছিল।
মুবাশার আব্বাস

এটি কি বাগ? CURRENT_TIMESTAMP "0000-00-00 00:00:00" কখনই ফিরে আসবে না, নাকি আমি ভুল? কেন আমার মাইএসকিএলডি সেটিংস পরিবর্তন করতে হবে?
15:30 এ

@letjump কারন কেউ আপনার মাইএসকিএল সার্ভারকে ভুলভাবে কনফিগার করেছে। আমি আমদানি করা একটি ডাটাবেস দিয়ে আমি এই সমস্যাটি হিট করছি। কলামে টাইমস্ট্যাম্পের জন্য ডিফল্ট মানটি কোনও বৈধ টাইমস্ট্যাম্প মান নয়। রিয়েল ফিক্সটি হ'ল 1970 এর মতো বৈধ কিছুতে ডিফল্ট টাইমস্ট্যাম্পটি আপডেট করা - প্রথম দিকের উপলভ্য। অস্থায়ী কর্মক্ষেত্র হ'ল ডেটাবেজে চেক করা অক্ষম করা।
anon58192932

9

ওএস এক্স ব্যবহার করে , হোমব্রিউ থেকে সিস্টেম ভেরিয়েবলগুলি এর সংকলিত ডিফল্টগুলির ভিত্তিতে মাইএসকিএল ইনস্টল করুন। সমাধানটি সিস্টেমের ভেরিয়েবলগুলি "এসকিউএল_মোড" থেকে "NO_ZERO_DATE" সরানোর জন্য।

কেবল দয়া করে মনে রাখবেন যে সুযোগটি জড়িত।

আপনি যদি কেবল আপনার সেশনেই প্রভাব ফেলতে চান তবে দয়া করে ব্যবহার করুন "@@session", উদাহরণস্বরূপ:

SET @@session.sql_mode ="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION".

এক্ষেত্রে আপনার সেশনটি শেষ হওয়ার পরে বা এটি পরিবর্তিত হওয়ার পরে এটি প্রভাব ফেলবে না। অন্যান্য অধিবেশনে এর প্রভাব পড়েনি।

আপনি যদি সমস্ত ক্লায়েন্টকে প্রভাবিত করতে চান তবে দয়া করে ব্যবহার করুন "@@global":

SET @@global.sql_mode ="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION".

এই ক্ষেত্রে, এটি পরিবর্তিত হওয়ার পরে সংযুক্ত ক্লায়েন্টগুলিতে কেবল প্রভাব ফেলে (বর্তমান সমস্ত ক্লায়েন্টের উপর প্রভাব ফেলবে না) এবং সার্ভারটি প্রস্থান করার পরে কাজ করবে না।


8

আমি হোমব্রু থেকে মাইএসকিউএল ইনস্টল করে ওএস এক্স এ এই সমস্যাটি সমাধান করতে সক্ষম হয়েছি

brew install mysql

নিম্নলিখিতটি /usr/local/etc/my.cnf এ যুক্ত করে

sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

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

brew tap homebrew/services
brew services restart mysql

7

নিম্নলিখিত কোডের সাথে আমার মাইএসকিউএল 5.7 এর সাথে একই রকম সমস্যা ছিল:

`update_date` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP

পরিবর্তে এটি ব্যবহার করে আমি স্থির করেছি:

`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP


2
আমি মনে করি এটি যখন স্রোতের ডিফল্ট হওয়ার জন্য অর্থবোধ করে তখন এটি সর্বোত্তম বিকল্প, তবে উদাহরণস্বরূপ জন্মের টাইমস্ট্যাম্পের জন্য এটি বোধগম্য হবে না।
মিওআ

7

এই সমস্যাটি এড়াতে, আপনাকে NO_ZERO_DATEমাইএসকিএল মোড কনফিগারেশন থেকে অপসারণ করতে হবে ।

  1. 'Phpmyadmin' এ যান।
  2. একবার phpmyadmin লোড হয়ে গেলে, 'ভেরিয়েবল' ট্যাবে ক্লিক করুন।
  3. 'এসকিএল মোড' অনুসন্ধান করুন।
  4. সম্পাদনা বিকল্পে ক্লিক করুন NO_ZERO_DATEএবং কনফিগারেশন থেকে (এবং এটির পূর্ববর্তী কমা) সরান ।

এটি wamp বা xamp সহ স্থানীয় পরিবেশে খুব সাধারণ একটি সমস্যা।


6

আপনার ডাটাবেস এসকিউএল ফাইলের শীর্ষে নিম্নলিখিত লাইনগুলি কেবল সংজ্ঞায়িত করুন।

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

এটা আমার জন্য কাজ করছে।


2

কঠোর এসকিউএল মোড অক্ষম করতে

Create disable_strict_mode.cnf file at /etc/mysql/conf.d/

ফাইলে এই দুটি লাইন লিখুন:

[mysqld]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

অবশেষে, এই কমান্ডটি দিয়ে মাইএসকিউএল পুনরায় চালু করুন:

sudo service mysql restart

1

আপনি মাইএসকিএল উদাহরণে টাইমজোন সেটিংটি পরীক্ষা করতে পছন্দ করতে পারেন:

mysql> show variables like 'time_zone';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| time_zone     | SYSTEM |
+---------------+--------+

আমার ক্ষেত্রে, আমি বুঝতে পারি যে অন্তর্নিহিত সিস্টেমটির সময়সীমাটি ইউটিসির পরিবর্তে বিএসটি-তে সেট করা ছিল এবং তাই তৈরি টেবিলটিতে '1970-01-01 00:00:01' এর ডিফল্টটি 1 ঘন্টা পিছনে জোর করা হয়েছিল, ফলস্বরূপ একটি অবৈধ টাইমস্ট্যাম্প মান।

আমার জন্য, আমি আসলে ইউটিসি-তে মেশিনের টাইমজোন সেট করতে চেয়েছিলাম এবং এটি আমার বাছাই করে। আমি যখন সেন্টোস / 7 চালাচ্ছিলাম, আমি কেবল তাই করেছি

# timedatectl set-timezone UTC

এবং সবকিছু পুনরায় আরম্ভ।


1

ডিফল্ট মানগুলি 1000 সাল থেকে শুরু করা উচিত।

উদাহরণ স্বরূপ,

ALTER TABLE mytable last_active DATETIME DEFAULT '1000-01-01 00:00:00'

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


1

এই পরিবর্তন:

`create_date` TIMESTAMP NOT NULL DEFAULT  '0000-00-00 00:00:00',
`update_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP  ,

পরবর্তী:

`create_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP ,
`update_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,

1
পর্যালোচনা থেকে: হাই, দয়া করে কেবল উত্স কোড দিয়ে উত্তর দিবেন না। আপনার সমাধান কীভাবে কাজ করে সে সম্পর্কে একটি দুর্দান্ত বর্ণনা দেওয়ার চেষ্টা করুন। দেখুন: আমি কীভাবে ভাল উত্তর লিখব? । ধন্যবাদ
সানুন ןɐ কিউপি

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

0

আপনি কেবল এটি পরিবর্তন করতে পারেন:

`create_date` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',

এই জাতীয় কিছু:

`create_date` TIMESTAMP NOT NULL DEFAULT '2018-04-01 12:00:00',
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.