2010-04-10 11 views
23

मेरे पास निम्न SQL द्वारा परिभाषित एक तालिका है:सशर्त SQLite जांच बाधा?

CREATE TABLE test (
    id  integer PRIMARY KEY NOT NULL UNIQUE, 
    status text NOT NULL, 
    enddate date, 
    /* Checks */ 
    CHECK (status IN ("Current", "Complete")) 
); 

मैं एक बाधा जोड़ना चाहता हूं जिसके लिए enddate को गैर-शून्य होना आवश्यक है यदिstatus "पूर्ण" है।

क्या यह संभव है? मैं SQLite v3.6.16 का उपयोग कर रहा हूँ।

उत्तर

35

कैसे के बारे में:

CHECK (status = "Current" or (status = "Complete" and enddate is not null)) 
+2

धन्यवाद, यह काम करता है। क्या यह एकमात्र तरीका है? भविष्य में मेरे पास बड़ी संख्या में स्थितियां हो सकती हैं और चेक काफी बड़ा हो सकता है। – Rezzie

+4

जब बाधाएं बहुत जटिल हो जाती हैं, तो आम तौर पर इसे लागू करने के लिए तालिका के सामने एक परत डालना होता है। संग्रहीत प्रक्रिया परत, या डेटा एक्सेस लाइब्रेरी की तरह। – Andomar

+0

सलाह के लिए धन्यवाद। – Rezzie

5
CREATE TABLE test (
    id  integer PRIMARY KEY, 
    status text NOT NULL CHECK (status IN ('Current', 'Complete')), 
    enddate date NOT NULL 
); 

यह CHECK बाधा लिखा इनलाइन साथ, SQLite में काम करेंगे। मैंने एस्ट्रोफ़ेस को डबल कोट्स बदल दिए ताकि इसका उपयोग PHP में किया जा सके।

+0

क्या आपने प्रश्न पढ़ा था? उन्होंने ** बोल्ड ** में महत्वपूर्ण हिस्सा भी रखा है जिसे आपने अभी खारिज कर दिया है। – TWiStErRob

0

आपको एक ही टेबल पर एकाधिक CHECK बाधाओं से रोकने के लिए कुछ भी नहीं रोक रहा है। IMO सरल और सबसे आसानी से विस्तार योग्य समाधान:

CHECK (status IN ("Current", "Complete")) 
CHECK (status <> "Complete" OR enddate IS NOT NULL) 

इस तथ्य यह है कि अगर एक तो बी तार्किक भी नहीं ए या बी के बराबर है उपयोग करता है।