मैं एक डीबी को माईसाम से इनो डीबी में परिवर्तित कर रहा हूं। मुझे #1292 गलत डेटाटाइम मान की त्रुटि मिल रही है: '0000-00-00 00:00:00'। मैंने इनमें से कुछ त्रुटियों के बारे में पढ़ा है लेकिन मैं डीबी में जानकारी संग्रहीत करने के तरीके को नहीं बदल सकता। यह उपरोक्त प्रारूप में संग्रहीत हो जाता है। क्या इसका कोई अच्छा समाधान है?
1 उत्तर
यहाँ त्रुटि है:
mysql> update mytable set d = null where d = '0000-00-00 00:00:00';
ERROR 1292 (22007): Incorrect datetime value: '0000-00-00 00:00:00' for column 'd' at row 1
यह समस्या क्यों है? क्योंकि '0000-00-00 00:00:00'
sql मोड NO_ZERO_DATE और NO_ZERO_IN_DATE का उल्लंघन करता है। MySQL 8.0 में, जब आप STRICT_TRANS_TABLES या STRICT_ALL_TABLES का उपयोग करते हैं तो ये मोड निहित होते हैं।
डेटाटाइम की तुलना करते समय अपने WHERE क्लॉज में केवल उस मान का उपयोग करना उल्लंघन को ट्रिगर करता है, क्योंकि MySQL उस स्ट्रिंग को डेटाटाइम मान में बदलने का प्रयास करता है।
यहां एक समाधान है: अस्थायी रूप से अमान्य दिनांक मानों को अनुमति देने के लिए sql मोड को गैर-सख्त में बदलें।
mysql> set sql_mode='';
यह केवल आपके वर्तमान सत्र के दौरान sql_mode
को बदलता है। एक बार जब आप mysql क्लाइंट को छोड़ देते हैं, तो सत्र-दायरे वाले विकल्प गायब हो जाएंगे, और अगली बार जब आप कोई सत्र खोलेंगे, तो यह वैश्विक सेटिंग से विकल्प लेगा।
यह अद्यतन की अनुमति देता है, ताकि आप अपनी क्वेरी में उस अमान्य डेटाटाइम स्ट्रिंग का उपयोग कम से कम लंबे समय तक संबंधित मानों को न्यूल में बदलने के लिए कर सकें।
mysql> update mytable set d = null where d = '0000-00-00 00:00:00';
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from mytable;
+----+------+
| id | d |
+----+------+
| 1 | NULL |
+----+------+
इस क्लीनअप ऑपरेशन को छोड़कर अपने sql मोड को गैर-सख्त न बनाएं। सख्त sql मोड का उपयोग करना एक अच्छी बात है, क्योंकि यह डेटाबेस को फर्जी डेटा मानों को संग्रहीत करने से रोकता है। यदि आप किसी ऐसे मान को संग्रहीत करते हैं जो किसी स्तंभ में फ़िट नहीं होता है, तो सख्त मोड डेटा काट-छाँट को भी रोकता है।
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
mysql
MySQL एक फ्री, ओपन सोर्स रिलेशनल डेटाबेस मैनेजमेंट सिस्टम (RDBMS) है जो स्ट्रक्चर्ड क्वेरी लैंग्वेज (SQL) का उपयोग करता है। इस टैग को अन्य DBs जैसे SQL Server, SQLite आदि के लिए उपयोग न करें। वे विभिन्न DB हैं जो सभी डेटा का प्रबंधन करने के लिए SQL की अपनी बोलियों का उपयोग करते हैं।
NULL
स्टोर करें।mytable
SET column_name= NULL WHERE column_name= '0000-00-00 00:00:00' मुझे वही त्रुटि मिलती है - कि यह एक गलत समय मान है। मैं कॉलम संरचना को नहीं बदल सकता जो एक DATETIME है। NULL नया डिफ़ॉल्ट है, लेकिन तब नहीं था जब कुछ डेटा दर्ज किया गया थाUPDATE users SET col = NULL WHERE CAST(col AS CHAR(20)) = '0000-00-00 00:00:00';