मैं कॉलम नामों के रूप में उपयोग किए जाने वाले आरक्षित शब्दों से कैसे बच सकता हूं? MySQL / तालिका बनाएँ


139

मैं .NET में कक्षाओं से तालिकाओं को उत्पन्न कर रहा हूं और एक समस्या यह है कि एक वर्ग का नाम फ़ील्ड हो सकता है keyजो एक आरक्षित MySQL कीवर्ड है। मैं इसे एक सारणी बनाने में कैसे बचूँ? (नोट: नीचे दी गई अन्य समस्या है पाठ को अनुक्रमित / अद्वितीय करने के लिए एक निश्चित आकार होना चाहिए)

create table if not exists misc_info (
id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
key TEXT UNIQUE NOT NULL,
value TEXT NOT NULL)ENGINE=INNODB;

जवाबों:


184

यदि ANSI SQL मोड सक्षम है तो आप दोहरे उद्धरण चिह्नों का उपयोग कर सकते हैं

CREATE TABLE IF NOT EXISTS misc_info
  (
     id    INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
     "key" TEXT UNIQUE NOT NULL,
     value TEXT NOT NULL
  )
ENGINE=INNODB; 

या मालिकाना वापस टिक अन्यथा भागने। ( इस उत्तर` में विभिन्न कीबोर्ड लेआउट के चरित्र को कहां ढूंढना है )

CREATE TABLE IF NOT EXISTS misc_info
  (
     id    INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
     `key` TEXT UNIQUE NOT NULL,
     value TEXT NOT NULL
  )
ENGINE=INNODB; 

(स्रोत: MySQL संदर्भ मैनुअल, 9.3 सुरक्षित शब्द )


5
IMHO आपको हमेशा सभी फ़ील्ड नामों और तालिका नामों को उद्धृत करना चाहिए।
rjmunro

10
@rjmunro - ऐसा करना कुछ अधिक रक्षात्मक है क्योंकि यह आपको बाद के संस्करणों में पेश किए जा रहे नए आरक्षित खोजशब्दों से बचाता है लेकिन मुझे दृश्य अव्यवस्था पसंद नहीं है।
मार्टिन स्मिथ

कैसेंड्रा के CQL में कीवर्ड के लिए एक ही फिक्स (बचने के लिए डबल कोट) काम करता है। थोड़ा-सा विषय, मुझे पता है, लेकिन यह धागा कैसंड्रा-विशिष्ट खोज में सामने आया।
गॉडफ्रे ड्यूक

MySQL संदर्भ मैनुअल लिंक अभी के लिए टूट गया है। वास्तविक लिंक: dev.mysql.com/doc/refman/5.7/en/keywords.html
Miha_x64

71

आपको वापस टिक चरित्र (`) का उपयोग करना चाहिए जैसे:

create table if not exists misc_info (
id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
`key` TEXT UNIQUE NOT NULL,
value TEXT NOT NULL)ENGINE=INNODB;

15

यदि आप विभिन्न SQL सर्वर के बीच पोर्टेबिलिटी में रुचि रखते हैं, तो आपको ANSI SQL प्रश्नों का उपयोग करना चाहिए। ANSI SQL में स्ट्रिंग एस्केपिंग डबल कोट्स (") का उपयोग करके किया जाता है। दुर्भाग्य से, यह एस्केपिंग विधि MySQL के लिए पोर्टेबल नहीं है, जब तक कि यह ANSI संगतता मोड में सेट नहीं है।

व्यक्तिगत रूप से, मैं हमेशा अपने MySQL सर्वर को --sql-mode = 'ANSI' तर्क के साथ शुरू करता हूं क्योंकि इससे बचने के लिए दोनों तरीकों की अनुमति मिलती है। यदि आप उन क्वेरी को लिख रहे हैं जो एक MySQL सर्वर में निष्पादित होने जा रहे हैं जो सेटअप नहीं था / आपके द्वारा नियंत्रित किया जाता है, तो यहां आप क्या कर सकते हैं:

  • ANSI SQL में आप सभी SQL क्वेरी लिखें
  • निम्नलिखित MySQL के विशिष्ट प्रश्नों में उन्हें शामिल करें:

    SET @OLD_SQL_MODE=@@SQL_MODE;
    SET SESSION SQL_MODE='ANSI';
    -- ANSI SQL queries
    SET SESSION SQL_MODE=@OLD_SQL_MODE;

इस तरह केवल MySQL के विशिष्ट प्रश्न आपके .sql स्क्रिप्ट के आरंभ और अंत में हैं। यदि आप उन्हें किसी भिन्न सर्वर के लिए शिप करना चाहते हैं तो इन 3 प्रश्नों को हटा दें और आप सभी सेट हो जाएंगे। और भी आसानी से आप एक स्क्रिप्ट बना सकते हैं जिसका नाम है: script_mysql.sql जिसमें उपरोक्त मोड सेटिंग क्वेरी शामिल होंगी, एक script_ansi.sql स्क्रिप्ट स्रोत और मोड रीसेट करें।


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