DATE या DATETIME के लिए डिफ़ॉल्ट मान सेट करते समय mysql में त्रुटि




console (8)

मैं MySql सर्वर 5.7.11 चला रहा हूं और यह वाक्य:

updated datetime NOT NULL DEFAULT '0000-00-00 00:00:00'

काम नहीं कर रहा है। त्रुटि देते हुए:

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

लेकिन निम्नलिखित:

updated datetime NOT NULL DEFAULT '1000-01-01 00:00:00'

बस काम करता है

DATE का वही मामला।

एक विचार के रूप में, यह mysql डॉक्स में उल्लिखित है:

DATE प्रकार का उपयोग दिनांक भाग के साथ मानों के लिए किया जाता है लेकिन कोई समय भाग नहीं। MySQL 'YYYY-MM-DD' प्रारूप में DATE मानों को पुनः प्राप्त और प्रदर्शित करता है। समर्थित रेंज '1000-01-01' से '9999-12-31' तक है।

अगर वे भी कहते हैं:

अमान्य DATE, DATETIME या TIMESTAMP मान उचित प्रकार ("0000-00-00 'या' 0000-00-00 00:00:00 'के" शून्य "मान में परिवर्तित हो जाते हैं)।

Mysql प्रलेखन से दूसरे उद्धरण को भी ध्यान में रखते हुए, क्या कोई मुझे बता सकता है कि वह यह त्रुटि क्यों दे रहा है?


सिंटैक्स समस्या को कॉन्फ़िगर करें

* Nix सिस्टम के तहत MYSQL के कुछ संस्करणों पर (५.SQL। * परीक्षण किया गया) आपको इस वाक्यविन्यास का उपयोग करना चाहिए:

[mysqld]

sql-mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_ENGINE_SUBSTITUTION"

ये काम नहीं करेंगे:

पानी का छींटा नहीं

sql-mode=NO_ENGINE_SUBSTITUTION

अंडरस्कोर कोई उद्धरण नहीं

sql_mode=NO_ENGINE_SUBSTITUTION

अंडरस्कोर और उद्धरण

sql_mode="NO_ENGINE_SUBSTITUTION"

कॉन्फ़िगरेशन मानों और sql- मोड की अधिक पूर्ण समीक्षा:

स्थायी Sql मोड फ़्लैग को कैसे सेटअप करें


MySQL कार्यक्षेत्र के साथ समस्या को हल करने के लिए (सर्वर साइड पर समाधान लागू करने के बाद):

वरीयताओं के पैनल में TRADITIONAL के लिए SQL_MODE निकालें।


पहले वर्तमान सत्र sql_mode चयन करें:

SELECT @@SESSION.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'

और फिर 'NO_ZERO_DATE' बिना sql_mode सेट करें:

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 लिए भी कर सकते हैं:

SELECT @@GLOBAL.sql_mode;
SET GLOBAL sql_mode = '...';

बस पंक्ति जोड़ें: sql_mode = "NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

अंदर की फ़ाइल: /etc/mysql/mysql.conf.d/mysqld.cnf

तब sudo service mysql restart


मैं एक ऐसी स्थिति में आ गया, जहाँ डेट फ़ील्ड के लिए NULL और 0000-00-00 के बीच डेटा मिलाया गया था। लेकिन मुझे नहीं पता था कि '0000-00-00' को NULL को कैसे अपडेट किया जाए, क्योंकि

 update my_table set my_date_field=NULL where my_date_field='0000-00-00'

किसी भी अधिक की अनुमति नहीं है। मेरा वर्कअराउंड काफी सरल था:

update my_table set my_date_field=NULL where my_date_field<'1000-01-01'

क्योंकि इस तारीख से पहले सभी गलत my_date_field मान (सही तारीखें या नहीं) थे।


यह 5.7.8 के लिए काम करता है:

mysql> create table t1(updated datetime NOT NULL DEFAULT '0000-00-00 00:00:00');
Query OK, 0 rows affected (0.01 sec)

mysql> show create table t1;
+-------+-------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                            |
+-------+-------------------------------------------------------------------------------------------------------------------------+
| t1    | CREATE TABLE `t1` (
  `updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-------+-------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.8-rc  |
+-----------+
1 row in set (0.00 sec)

आप अपनी समस्या को फिर से बनाने के लिए एक SQLFiddle बना सकते हैं।

http://sqlfiddle.com/

यदि यह MySQL 5.6 और 5.7.8 के लिए काम करता है, लेकिन 5.7.11 पर विफल रहता है। फिर यह 5.7.11 के लिए प्रतिगमन बग हो सकता है।


mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64) लिए mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64) लिए विकल्प संयोजन।

फेंक नहीं है:

STRICT_TRANS_TABLES + NO_ZERO_DATE

फेंकता:

STRICT_TRANS_TABLES + NO_ZERO_IN_DATE

उबंटू में /etc/mysql/my.cnf में मेरी सेटिंग्स:

[mysqld]
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

set global sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';






console