ERROR 1067 (42000): 'create_at' के लिए अमान्य डिफ़ॉल्ट मान


100

जब मैंने तालिका को बदलने की कोशिश की तो उसमें त्रुटि दिखाई दी:

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

मैं इस त्रुटि के लिए googled था, लेकिन मुझे सब कुछ ऐसा लगा मानो उन्होंने टाइमस्टैम्प को बदलने की कोशिश की हो। हालाँकि यहाँ मैं एक नया कॉलम जोड़ने की कोशिश कर रहा हूँ और मुझे यह त्रुटि मिल रही है:

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

और मेरी मेज के अंतिम दो स्तंभ हैं created_atऔर updated_at

यहाँ मेरी तालिका संरचना है:

यहाँ छवि विवरण दर्ज करें


इन स्तंभों के लिए डिफ़ॉल्ट मान क्या हैं? क्या आप कृपया टेबल संरचना साझा कर सकते हैं?
प्रियांशु

@Priyanshu मैंने अपनी टेबल संरचना
iamsujit

2
पिछले दो कॉलम के लिए डिफ़ॉल्ट मान current_timestamp सेट करें।
प्रियांशु

जवाबों:


144

समस्या sql_modes की वजह से है । कृपया कमांड द्वारा अपने वर्तमान sql_modes की जाँच करें:

show variables like 'sql_mode' ; 

और इसे काम करने के लिए sql_mode " NO_ZERO_IN_DATE, NO_ZERO_DATE " को हटा दें । यह mysql के नए संस्करणों में डिफ़ॉल्ट sql_mode है।

आप sql_mode को विश्व स्तर पर कमांड द्वारा रूट के रूप में सेट कर सकते हैं:

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

7
मैं यह जानता हूं, लेकिन मेरे सर्वर में sql_mode रिक्त दिखा रहा है, फिर भी काम नहीं कर रहा है, मैं [सर्वर संस्करण: 5.5.53-0ubuntu0.12.04.1 - (Ubuntu)] का उपयोग कर रहा हूं। सर्वर संस्करण को अपग्रेड किए बिना किसी का कोई समाधान हो सकता है?
प्रियब्रत आथा

क्या आपने वैश्विक कमांड द्वारा जाँच की है? और क्या समान सत्र के लिए sql_mode में कुछ भी नहीं है?
अमन अग्रवाल

मैंने 'sql_mode' जैसे शो वैरिएबल चेक किए; और आउटपुट Variable_name है। मान = sql_mode |
प्रियब्रत अथ

2
यह इस उत्तर के लिए उपयोगी होगा stackoverflow.com/questions/2317650/…
प्रेसन प्रदीप

4
5.7 के साथ मेरे लिए काम नहीं किया। निश्चित नहीं कि मुझे विश्व स्तर पर करना था या नहीं।
ब्रेट करें

95

बस, इससे पहले कि आप कोई बयान दें, इसे पहली पंक्ति में रखें:

SET sql_mode = '';

यह सिर्फ भयानक था। धन्यवाद दोस्त!
Novasol

7
पारितोषिक के लिए धन्यवाद। लेकिन केवल दिनांक प्रतिबंधों को हटाने से NO_ZERO_IN_DATE,NO_ZERO_DATEही हमें अन्य सुरक्षा सुविधाओं को बनाए रखने की अनुमति मिलती है:SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
कीटलडॉग

1
स्पष्टीकरण के लिए, इस कथन का उपयोग केवल विकास में किया जाना चाहिए, उत्पादन में नहीं।
अहमद मोहम्मद

28

तृतीय पक्ष डेटाबेस को स्थापित करने का प्रयास करते समय मैं एक ही त्रुटि पर आया था। मैंने उस समाधान का असफल प्रयास करने का प्रयास किया
SET sql_mode = '';

फिर मैंने नीचे कमांड की कोशिश की जो डेटाबेस को स्थापित करने की अनुमति देता है
SET GLOBAL sql_mode = '';


1
SET sql_mode = '';अब वंचित है, SET GLOBAL sql_mode = ''ठीक है
वादिम अनीसिमोव

25

कोशिश करें और निम्न कमांड चलाएँ:

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फ़ील्ड के लिए डिफ़ॉल्ट मान सेट नहीं कर रहे हैं । MySQL आपके कमांड को स्वीकार नहीं कर रहा है क्योंकि इन कॉलम के लिए मान शून्य नहीं हो सकते हैं।

उम्मीद है की यह मदद करेगा।


2
धन्यवाद, उत्थान, मैं अपने उपयोग के मामले में इस समाधान को पसंद करता हूं
क्रिस

5

मेरे मामले में मेरे पास आयात करने के लिए एक फाइल है। इसलिए मैंने बस SET sql_mode = '' जोड़ा; फ़ाइल की शुरुआत में और यह काम करता है!


5

यह क्वेरी चलाएँ:

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

इससे मेरा काम बनता है


वैसे SET time_zone = "+00: 00" की आवश्यकता नहीं है;
सफक सिप्लाक

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;
  • क्योंकि TIMESTAMP मान एपोच सेकंड्स के रूप में संग्रहीत किया जाता है, टाइमस्टैम्प मान '1970-01-01 00:00:00' (UTC) आरक्षित है क्योंकि दूसरा # 0 '0000-00-00 00:00:00' का प्रतिनिधित्व करने के लिए उपयोग किया जाता है '।
  • मारियाबीडी 5.5 में और इससे पहले प्रति टेबल केवल एक टाइमस्टैम्प कॉलम हो सकता था जिसमें 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

जैसा कि @Bernd बफेन के जवाब में बताया गया है। यह मारियाबीडी 5.5 के साथ मुद्दा है, मैं मारियाडीबी 5.5 को मारियाडीबी 10.1 पर अपग्रेड करता हूं और समस्या का समाधान करता हूं।

यहां मारियाडीबी 5.5 को मारियाडीबी 10.1 में सेंटोस 7 पर अपग्रेड करने के लिए कदम (64-बिट)

  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. बंद करो MariaDB, अगर पहले से ही चल रहा है service mariadb stop
  2. अद्यतन करें

    yum update

  3. मारियाडीबी और प्रदर्शन अपग्रेड शुरू करना

    service mariadb start

    mysql_upgrade

सब कुछ हो गया।

MariaDB संस्करण जांचें: 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


1

Mysql5.7 के लिए, mysql कमांड लाइन में लॉगिन करें और कमांड चलाएँ, mysql> 'sql_mode' जैसे वैरिएबल दिखाएं; यह दिखाएगा कि sq__ode में NO_ZERO_IN_DATE, NO_ZERO_DATE।

यहाँ छवि विवरण दर्ज करें

दो विकल्प को हटाने के लिए अपने mysql conf फ़ाइल में [mysqld] के नीचे एक लाइन जोड़ने का प्रयास करें, मेरा (Ubuntu 16 पर mysql 5.7) /etc/mysql/mysql.conf.dmysqld.cnf है

यहाँ छवि विवरण दर्ज करें

अब mysql को पुनरारंभ करें। यह काम करता हैं!


0

मैसूरल l०.१: के लिए:

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 फ़ाइल खोलें (आम तौर पर आप my.cnf फ़ाइल को /etc/my.cnf या /etc/mysql/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. Mysql सर्वर को पुनरारंभ करें

    $ /etc/init.d/mysql restart

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