'Create_date' टाइमस्टैम्प फ़ील्ड के लिए अमान्य डिफ़ॉल्ट मान


186

मेरे पास निम्नलिखित sql स्टेटमेंट है

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-समुदाय पर काम करता है।
जसप्रीत चहल

मेरे अंत में भी क्वेरी ठीक है।
शक्ति सिंह

निश्चित नहीं है, लेकिन उस क्षेत्र को एक अलग नाम दें और कोशिश करें?
नवीन कुमार

मैं ubuntu 10.04 में mysql 5.1.56 समुदाय का उपयोग करता हूं। और काम नहीं कर रहा है
रॉबर्ट

5
किसी भी शून्य तारीख को तारीख की आवश्यकता नहीं है। '1970-01-01 00:00:01' का उपयोग करें। [यहाँ से लिया गया] [१] [१]: dba.stackexchange.com/questions/6171/…
Jadeye

जवाबों:


176

यह सर्वर SQL मोड के कारण है - NO_ZERO_DATE

संदर्भ से: NO_ZERO_DATE- सख्त मोड में, '0000-00-00'वैध तिथि के रूप में अनुमति न दें । आप अभी भी IGNORE विकल्प के साथ शून्य तिथियां सम्मिलित कर सकते हैं । जब सख्त मोड में नहीं होता है, तो तारीख स्वीकार कर ली जाती है, लेकिन एक चेतावनी उत्पन्न होती है।


19
मैं कैसे उपेक्षा विकल्प दे सकता हूँ?
रॉबर्ट

9
आप इस विकल्प को अनदेखा नहीं कर सकते। यह सर्वर विकल्प है। यदि आपके पास my.ini (mysql कॉन्फ़िगरेशन फ़ाइल) तक पहुंच है, तो NO_ZERO_DATE को sql-mode विकल्प से निकालें और सर्वर को पुनरारंभ करें।
देवर्थ

7
इस विकल्प को जांचने के लिए - SHOW VARIABLES LIKE 'sql_mode' चलाएं
Devart

6
मैंने mysql कार्यक्षेत्र का उपयोग करके स्क्रिप्ट तैयार की। स्क्रिप्ट में sql_mode पारंपरिक पर सेट है। यदि मैं पारंपरिक हटाता हूं, तो स्क्रिप्ट काम करती है।
रॉबर्ट

17
MySQL कार्यक्षेत्र वरीयताओं में, टैब पर जाएं 'मॉडल: MySQL'। "STRICT_TRANS_TABLES, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION" पर सेट की जाने वाली 'SQL_MODE का उपयोग' स्क्रिप्ट में सेट करने के लिए समस्या को हल करता है।
sgtdck

140

यदि आपने MySQL कार्यक्षेत्र से स्क्रिप्ट उत्पन्न की है।

निम्न पंक्ति उत्पन्न होती है

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

SQL_MODE से TRADITIONAL निकालें, और फिर स्क्रिप्ट को ठीक काम करना चाहिए

इसके अलावा, आप SQL_MODE को अमान्य तिथियों के रूप में सेट कर सकते हैं

SET SQL_MODE='ALLOW_INVALID_DATES';

1
मुझे कुछ समय बचाया कि यह नरक क्यों काम नहीं कर रहा है :)
Srneczek

5
अहह धन्यवाद। SQL_MODE = 'ALLOW_INVALID_DATES' सेट करें; एक जीवन रक्षक था। मुझे यह समस्या तब हुई जब मैंने एक वर्डप्रेस साइट को किसी अन्य सर्वर (दोनों स्थानीय) पर माइग्रेट किया और उसने मुझे इस त्रुटि के कारण डेटाबेस डेटा आयात करने की अनुमति नहीं दी, भले ही इस त्रुटि के साथ तालिकाओं में कोई पंक्तियाँ नहीं थीं।
मकाटो

एक जादू की तरह काम किया! धन्यवाद।
Moreirapontocom

52

TIMESTAMP की रेंज '1970-01-01 00:00:01' UTC से '2038-01-19 03:14:07' UTC है (देखें doc ) है। डिफ़ॉल्ट मान उस सीमा के भीतर होना चाहिए।

अन्य विषम, संबंधित, व्यवहार:

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)

साइड नोट, यदि आप NULLS डालना चाहते हैं:

CREATE TABLE tbl4 (
    ts TIMESTAMP NULL DEFAULT NULL);

1
मेरे साथ ऐसा हो रहा है। Wth चल रहा है? ts2 भी "NOT NULL" नहीं है ...!
पेद्रोद

2
ऐसा इसलिए हो सकता है क्योंकि "यदि आप किसी तालिका में पहले TIMESTAMP स्तंभ के लिए कोई मान सेट नहीं करते हैं, तो प्रश्न में पंक्ति (ओं) पर UPDATE या INSERT क्वेरी करते समय MariaDB स्वचालित रूप से वर्तमान तिथि और समय निर्दिष्ट करेगा।" - MariaDB डॉक्स
jsphpl

1
मुझे इसका उपयोग पसंद है column_name TIMESTAMP DEFAULT NOW()। हर स्थिति के लिए उपयुक्त नहीं हो सकता है, लेकिन मुझे लगा कि मैं भी इससे निपट रहा हूं।
DeezCashews 15

1
column_name TIMESTAMP DEFAULT '1970-01-01 00:00:01' ने मेरे लिए चाल चली। धन्यवाद!
मेटाफा

41

Ubuntu डेस्कटॉप 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. सहेजें और फिर mysql सेवा को पुनः आरंभ करें:

    sudo service mysql restart


8
इसने मदद की, सिवाय इसके कि sql_modeubuntu16.04 पर mySQL के मेरे उदाहरण के लिए वहाँ नहीं था। मुझे "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 से छुटकारा पाने के रेखा से नीचे # जोड़ना: तो, यहाँ है कि यह कैसे अब लग रहा है है
OK999

आप सही हैं .. मैंने उस सख्त मोड को अक्षम करने के लिए पहले जोड़ा था .. और जब मैंने इसे इस विशेष मुद्दे के लिए संपादित किया, तो sql_modeप्रविष्टि पहले से ही थी।
मुबाशर अब्बास

क्या यह एक बग है? CURRENT_TIMESTAMP को कभी भी "0000-00-00 00:00:00" नहीं लौटाना चाहिए, या मैं गलत हूँ? मुझे mysqld सेटिंग क्यों बदलनी चाहिए?
Letjump

@letsjump क्योंकि किसी ने आपके mysql सर्वर को गलत तरीके से कॉन्फ़िगर किया है। मैं एक डेटाबेस मैं आयात के साथ इस मुद्दे को मार रहा हूँ। किसी कॉलम में टाइमस्टैम्प के लिए डिफ़ॉल्ट मान एक वैध टाइमस्टैम्प मूल्य नहीं है। वास्तविक निर्धारण डिफ़ॉल्ट टाइमस्टैम्प को 1970 की तरह मान्य किसी चीज़ में अद्यतन करने के लिए है - सबसे पहले उपलब्ध तारीख। अस्थायी वर्कअराउंड डेटाबेस पर जाँच को अक्षम करना है।
Anon58192932

9

OS X का उपयोग करके , Homebrew से mysql स्थापित करें , सिस्टम वेरिएबल्स इसके संकलित इन डिफॉल्ट्स के आधार पर। समाधान सिस्टम चर "sql_mode" से "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

मैं होमबॉव से MySQL स्थापित करके ओएस एक्स पर इस मुद्दे को हल करने में सक्षम था

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

और MySQL को पुनः आरंभ करना

brew tap homebrew/services
brew services restart mysql

7

मैं निम्नलिखित कोड के साथ MySQL 5.7 के साथ एक समान मुद्दा था:

`update_date` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP

मैंने इसके बजाय इसका उपयोग करके तय किया:

`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP


2
मुझे लगता है कि यह वास्तव में सबसे अच्छा विकल्प है जब यह वर्तमान के लिए डिफ़ॉल्ट करने के लिए समझ में आता है, लेकिन यह जन्म टाइमस्टैम्प के लिए समझ में नहीं आएगा - सिर्फ एक उदाहरण के रूप में।
म्याऊ

7

इस समस्या से बचने के लिए, आपको NO_ZERO_DATEmysql मोड कॉन्फ़िगरेशन से निकालना होगा ।

  1. 'Phpmyadmin' पर जाएं।
  2. एक बार phpmyadmin लोड होने के बाद, 'वैरिएबल' टैब पर क्लिक करें।
  3. 'Sql मोड' के लिए खोजें।
  4. संपादन विकल्प पर क्लिक करें और NO_ZERO_DATEकॉन्फ़िगरेशन से (और इसकी अनुगामी अल्पविराम) निकालें ।

यह स्थानीय वातावरण में wamp या xamp के साथ एक बहुत ही सामान्य समस्या है।


6

बस अपने डेटाबेस एसक्यूएल फ़ाइल के शीर्ष पर निम्नलिखित लाइनों को परिभाषित करें।

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

यह मेरे लिए काम कर रहा है।


2

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

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

अंत में, इस आदेश के साथ MySQL पुनः आरंभ करें:

sudo service mysql restart

1

आप MySql उदाहरण पर टाइमज़ोन सेटिंग की जांच करना पसंद कर सकते हैं:

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

मेरे मामले में, मैंने महसूस किया कि अंतर्निहित प्रणाली में UTC के बजाय BST सेट करने के लिए टाइमज़ोन था, और इसलिए बनाएँ तालिका में '1970-01-01 00:00:01' का डिफ़ॉल्ट 1 घंटे पीछे किया जा रहा था, जिसके परिणामस्वरूप एक अवैध टाइमस्टैम्प मूल्य।

मेरे लिए, मैं वास्तव में UTC के लिए मशीन का टाइमज़ोन सेट चाहता था, और इसने मुझे छाँट दिया। जैसा कि मैं Centos / 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
समीक्षा से: हाय, कृपया स्रोत कोड के साथ जवाब न दें। आपका समाधान कैसे काम करता है, इसके बारे में अच्छा विवरण देने का प्रयास करें। देखें: मैं एक अच्छा जवाब कैसे लिखूं? । धन्यवाद
sɐunıɔ ןɐ qɐp

यदि यह एक वर्डप्रेस साइट है, तो कृपया कोर वर्डप्रेस टेबल को अपडेट न करें। कई प्लगइन्स ज़ीरो के मूल्य की उम्मीद करते हैं, इसलिए वर्डप्रेस इस डिफ़ॉल्ट मान को उन कारणों से नहीं बदल सकता है जो प्लगइन्स को तोड़ देंगे। Wordpress थ्रेड और Wordpress समर्थन करते हैं । डिफ़ॉल्ट मूल्यों पर निर्भर कोड की पहचान के बिना डेटाबेस संरचना को बदलने से परेशान कीड़े हो सकते हैं। हालांकि यह कई मामलों में समाधान के रूप में काम कर सकता है, लेकिन यह दूसरों में कहर ढा सकता है। सार्वभौमिक समाधान नहीं।
शेरलहोमन

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',
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.