MySQL में टेबल या कॉलम नाम के रूप में आरक्षित शब्द का उपयोग करने के कारण सिंटैक्स त्रुटि
मैं नीचे के रूप में एक सरल MySQL क्वेरी निष्पादित करने की कोशिश कर रहा हूं:
INSERT INTO user_details (username, location, key)
VALUES ('Tim', 'Florida', 42)
लेकिन मुझे निम्नलिखित त्रुटि मिल रही है:
त्रुटि 1064 (42000): आपके SQL सिंटैक्स में कोई त्रुटि है;
'key) VALUES ('Tim', 'Florida', 42)'
पंक्ति 1 के पास उपयोग करने के लिए सही सिंटैक्स के लिए अपने MySQL सर्वर संस्करण से मेल खाती पुस्तिका की जाँच करें
मैं समस्या को कैसे ठीक कर सकता हूं?
जवाब
#समस्या
MySQL में, कुछ शब्दों की तरह SELECT
, INSERT
, DELETE
आदि आरक्षित शब्द हैं। जब से उनका एक विशेष अर्थ होता है, MySQL इसे सिंटैक्स त्रुटि के रूप में मानता है जब भी आप उन्हें तालिका नाम, स्तंभ नाम, या अन्य प्रकार के पहचानकर्ता के रूप में उपयोग करते हैं - जब तक कि आप पहचानकर्ता को बैकटिक्स के साथ घेर नहीं लेते।
जैसा कि आधिकारिक डॉक्स में, खंड 10.2 स्कीमा ऑब्जेक्ट नाम (जोर जोड़ा) में दिया गया है:
डेटाबेस, टेबल, इंडेक्स, कॉलम, उपनाम, दृश्य, संग्रहीत कार्यविधि, विभाजन, तालपत्र, और अन्य ऑब्जेक्ट नामों सहित MySQL के भीतर कुछ वस्तुओं को पहचानकर्ता के रूप में जाना जाता है ।
...
यदि किसी पहचानकर्ता के पास विशेष वर्ण हैं या वह आरक्षित शब्द है , तो जब भी आप उसे संदर्भित करते हैं , तो आपको उसे उद्धृत करना होगा ।
...
पहचानकर्ता बोली वर्ण बैकटिक ("
`
") है:
कीवर्ड और आरक्षित शब्दों की एक पूरी सूची धारा 10.3 कीवर्ड और आरक्षित शब्दों में पाई जा सकती है । उस पृष्ठ में, "(आर)" के बाद के शब्द आरक्षित शब्द हैं। कुछ आरक्षित शब्दों को नीचे सूचीबद्ध किया गया है, जिनमें कई ऐसे भी हैं जो इस मुद्दे का कारण बनते हैं।
- जोड़ें
- तथा
- इससे पहले
- द्वारा
- कॉल
- मामला
- स्थिति
- हटाएँ
- DESC
- वर्णन
- से
- ग्रुप
- में
- सूचकांक
- सम्मिलित करें
- मध्यान्तर
- है
- चाभी
- पसंद
- आप LIMIT
- लंबा
- मैच
- नहीं
- विकल्प
- या
- गण
- PARTITION
- प्रतिक्रिया दें संदर्भ
- चुनते हैं
- टेबल
- सेवा
- अपडेट करें
- कहाँ पे
#समाधान
आपके पास दो विकल्प हैं।
1. पहचानकर्ता के रूप में आरक्षित शब्दों का उपयोग न करें
सबसे सरल उपाय बस पहचानकर्ता के रूप में आरक्षित शब्दों का उपयोग करने से बचना है। आप संभवतः अपने कॉलम के लिए एक और उचित नाम पा सकते हैं जो आरक्षित शब्द नहीं है।
ऐसा करने से कुछ फायदे हैं:
यह इस संभावना को समाप्त करता है कि आप या आपके डेटाबेस का उपयोग करने वाला कोई अन्य डेवलपर गलती से भूल जाने के कारण एक वाक्यविन्यास त्रुटि लिख देगा - या नहीं जानकर - कि एक विशेष पहचानकर्ता एक आरक्षित शब्द है। MySQL में कई आरक्षित शब्द हैं और अधिकांश डेवलपर्स को उन सभी को जानने की संभावना नहीं है। पहली बार में इन शब्दों का उपयोग नहीं करने से, आप अपने या भविष्य के डेवलपर्स के लिए जाल छोड़ने से बचते हैं।
पहचानकर्ताओं को उद्धृत करने के साधन SQL बोलियों के बीच भिन्न होते हैं। जबकि MySQL डिफ़ॉल्ट रूप से पहचानकर्ताओं को उद्धृत करने के लिए backticks का उपयोग करता है, ANSI- आज्ञाकारी SQL (और वास्तव में MySQL ANSI SQL मोड में, जैसा कि यहां उल्लेख किया गया है ) पहचानकर्ताओं के उद्धरण के लिए दोहरे उद्धरण चिह्नों का उपयोग करता है। जैसे, बैकटिक्स के साथ पहचानकर्ता को उद्धृत करने वाली क्वेरी अन्य SQL बोलियों के लिए आसानी से पोर्टेबल हैं।
विशुद्ध रूप से भविष्य की गलतियों के जोखिम को कम करने की खातिर, यह आमतौर पर पहचानकर्ता के बैकटिक-कोटिंग की तुलना में कार्रवाई का एक समझदार कोर्स है।
2. बैकटिक्स का प्रयोग करें
यदि तालिका या स्तंभ का नाम बदलना संभव नहीं है, तो 10.2 स्कीमा ऑब्जेक्ट नाम`
से पहले के उद्धरण में वर्णित बैकटिक्स ( ) में आपत्तिजनक पहचानकर्ता को लपेटें ।
उपयोग को प्रदर्शित करने के लिए एक उदाहरण ( 10.3 कीवर्ड और सुरक्षित शब्दों से लिया गया ):
mysql> CREATE TABLE interval (begin INT, end INT); ERROR 1064 (42000): You have an error in your SQL syntax. near 'interval (begin INT, end INT)'
mysql> CREATE TABLE
interval
(begin INT, end INT); Query OK, 0 rows affected (0.01 sec)
इसी प्रकार, प्रश्न से क्वेरी को key
बैकटिक्स में लपेटकर तय किया जा सकता है , जैसा कि नीचे दिखाया गया है:
INSERT INTO user_details (username, location, `key`)
VALUES ('Tim', 'Florida', 42)"; ^ ^