विशिष्ट मानों के लिए varchar () कॉलम को प्रतिबंधित करें?


94

क्या निर्दिष्ट करने का कोई तरीका है, उदाहरण के लिए MS SQL Server 2008 में एक varchar कॉलम के लिए 4 अलग-अलग मान?

उदाहरण के लिए, मुझे फ़्रीक्वेंसी (वर्चर) नामक एक कॉलम की आवश्यकता है जो केवल 'दैनिक', 'साप्ताहिक', 'मासिक', 'वार्षिक' को संभावित मानों के रूप में स्वीकार करता है

क्या तालिका बनाते समय SQL सर्वर प्रबंधन स्टूडियो में सेट करना संभव है?


5
यदि यह मान लेना सुरक्षित है कि कोई और मान्य मूल्य नहीं होंगे और तालिका में कई पंक्तियाँ होंगी, तो मैं संभव मानों को एक varchar () की तुलना में कुछ छोटे और तेज में सांकेतिक शब्दों में बदलना चाहूंगा।
विकर्स

जवाबों:


127

क्या आपने पहले से ही check constraintउस कॉलम को जोड़ने पर ध्यान दिया है जो मूल्यों को प्रतिबंधित करेगा? कुछ इस तरह:

CREATE TABLE SomeTable
(
   Id int NOT NULL,
   Frequency varchar(200),
   CONSTRAINT chk_Frequency CHECK (Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly'))
)

2
धन्यवाद - यह महान काम किया। एक छोटा सा बदलाव जो मुझे करना था, वह यह था कि "फ़्रिक्वेंसी इन ...." को कोष्ठक में भी संलग्न किया जाना था। SQL सर्वर स्टूडियो इसे किसी कारण के बिना पसंद नहीं आया।
एडम

1
क्या यह अड़चन जाँच मामला संवेदनशील है?
रवेन्डी

3
मुझे लगता है कि आप 4 लाइन के बाद एक कोमा से चूक गए थेFrequency varchar(200)
बिलओवरफ्लो

RWendi - डिफ़ॉल्ट SQL सर्वर कोलाज़ केस-असंवेदनशील है, जो डेटाबेस स्तर पर लागू होता है। आगे की जानकारी यहां stackoverflow.com/questions/1439485/…
jwoe

57

आप एक चेक बाधा चाहते हैं ।

CHECK बाधाएं तार्किक मान से मान्य मान निर्धारित करती हैं जो किसी अन्य स्तंभ में डेटा पर आधारित नहीं है। उदाहरण के लिए, एक वेतन स्तंभ के लिए मूल्यों की श्रेणी को एक CHECK बाधा बनाकर सीमित किया जा सकता है जो केवल डेटा के लिए अनुमति देता है जो $ 100,000 से $ 15,000 तक होता है। यह वेतन को नियमित वेतन सीमा से परे प्रवेश करने से रोकता है।

आप कुछ इस तरह चाहते हैं:

ALTER TABLE dbo.Table ADD CONSTRAINT CK_Table_Frequency
    CHECK (Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly'))

आप स्केलर फ़ंक्शंस के साथ चेक बाधाओं को भी लागू कर सकते हैं, जैसा कि ऊपर दिए गए लिंक में वर्णित है, जो कि मैं इसे कैसे करना पसंद करता हूं।


1
यह उत्तर भी अच्छा था .. हम एक से अधिक स्वीकार क्यों नहीं कर सकते हैं !! :)
एडम

1
हाँ, यह एक बेहतर है :), इसके लिए +1
ओवैस कुरैशी

11

व्यक्तिगत रूप से, मैं इसे छोटे के रूप में कोड करूँगा और:

  • या तो: इसे क्लाइंट पर टेक्स्ट में बदलें, 1 और 4 के बीच बाधा की जांच करें
  • या: एक विदेशी कुंजी के साथ एक लुकअप तालिका का उपयोग करें

कारण:

  • यह पाठ को स्टोर करने के लिए औसत 8 बाइट्स लेगा, टिनींट के लिए 1 बाइट। लाखों पंक्तियों में, इससे फर्क पड़ेगा।

  • टक्कर के बारे में क्या? क्या "दैनिक" "दैनिक" के समान है? इस तरह की तुलना करने के लिए संसाधनों की आवश्यकता होती है।

  • अंत में, क्या होगा यदि आप "बायवेक्ली" या "प्रति घंटा" जोड़ना चाहते हैं? इसके लिए एक स्कीमा परिवर्तन की आवश्यकता होती है जब आप एक लुकअप टेबल में नई पंक्तियाँ जोड़ सकते हैं।


5

जब आप एक तालिका संपादित कर रहे हों तो
राइट क्लिक करें -> चेक बाधाओं -> जोड़ें -> Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly')अभिव्यक्ति फ़ील्ड में कुछ लिखें और नाम (नाम) फ़ील्ड में एक अच्छा बाधा नाम लिखें ।
आप कर चुके हैं।

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