2011-08-04 14 views
16

मैं foo एस और bar एस और उनके बीच कई से अधिक संबंधों के साथ एक SQLite3 डेटाबेस स्थापित करने का प्रयास कर रहा हूं। यह मैं अब तक क्या मिल गया है है:SQLite कई से अधिक रिश्ते?

CREATE TABLE foo(
    id INTEGER PRIMARY KEY NOT NULL, 
    foo_col INTEGER NOT NULL 
); 
CREATE TABLE bar(
    id INTEGER PRIMARY KEY NOT NULL, 
    bar_col TEXT NOT NULL 
); 
CREATE TABLE foobar(
    foo_id INTEGER, 
    bar_id INTEGER, 
    FOREIGN KEY(foo_id) REFERENCES foo(id) ON DELETE CASCADE, 
    FOREIGN KEY(bar_id) REFERENCES bar(id) ON DELETE CASCADE 
); 
CREATE INDEX fooindex ON foobar(foo_id); 
CREATE INDEX tagindex ON foobar(tag_id); 

... लेकिन यह काम करने लगता है। मैं foo से एक पंक्ति हटा सकता हूं और यह foobar को प्रभावित नहीं करता है। मैं क्या गलत कर रहा हूं?

उत्तर

13

इस साइट से लिया गया, http://www.sqlite.org/foreignkeys.html

लाइब्रेरी मानते हुए कि विदेशी कुंजी बाधाओं के साथ संकलित किया गया है, इसे अभी भी PRAGMA foreign_keys कमांड का उपयोग करके रनटाइम पर एप्लिकेशन द्वारा सक्षम किया जाना चाहिए। उदाहरण के लिए:

sqlite> PRAGMA foreign_keys = ON; 

विदेशी कुंजी की कमी डिफ़ॉल्ट (पश्च संगतता के लिए) द्वारा अक्षम हैं, इसलिए प्रत्येक डेटाबेस कनेक्शन के लिए अलग से सक्षम होना चाहिए। (नोट, हालांकि, SQLite की भविष्य की रिलीज बदल सकती हैं ताकि विदेशी कुंजी बाधाएं डिफ़ॉल्ट रूप से सक्षम हो सकें। सावधान डेवलपर इस बारे में कोई धारणा नहीं करेंगे कि डिफ़ॉल्ट रूप से विदेशी कुंजी सक्षम हैं या नहीं, बल्कि उन्हें आवश्यकतानुसार सक्षम या अक्षम कर देगा।) यह निर्धारित करने के लिए कि क्या वर्तमान में विदेशी कुंजी सक्षम हैं, एप्लिकेशन PRAGMA विदेशी_कीज कथन का भी उपयोग कर सकता है। निम्नलिखित कमांड लाइन सत्र इस दर्शाता है:

sqlite> PRAGMA foreign_keys; 
0 
sqlite> PRAGMA foreign_keys = ON; 
sqlite> PRAGMA foreign_keys; 
1 
sqlite> PRAGMA foreign_keys = OFF; 
sqlite> PRAGMA foreign_keys; 
0 

सुझाव: आदेश "PRAGMA foreign_keys" "0" या "1" युक्त एक ही पंक्ति का कोई डेटा रिटर्न के बजाय, तो SQLite के संस्करण प्रयोग कर रहे विदेशी कुंजी का समर्थन नहीं करता है (या तो क्योंकि यह 3.6.1 9 से बड़ा है या क्योंकि इसे SQLITE_OMIT_FOREIGN_KEY या SQLITE_OMIT_TRIGGER परिभाषित किया गया था)।

बहु-कथन लेनदेन के बीच में विदेशी कुंजी बाधाओं को सक्षम या अक्षम करना संभव नहीं है (जब SQLite ऑटोकॉमिट मोड में नहीं है)। ऐसा करने का प्रयास करने से कोई त्रुटि नहीं आती है; इसका कोई प्रभाव नहीं है।

+0

तालिका foobar को शायद प्राथमिक कुंजी बाधा की आवश्यकता है (foo_id, bar_id)। लेकिन यह एक अलग मुद्दा है। –

+0

@Catcall: मेरी पोस्ट पर टिप्पणी करने के लिए स्वतंत्र महसूस करें। – wes

+0

ऐस का उत्तर, जो सीधे SQLite दस्तावेज़ से है, सटीक और पूर्ण है। लेकिन जैसा कि मैंने कहा, तालिका foobar भी 'प्राथमिक कुंजी (foo_id, bar_id)' की जरूरत है। –

संबंधित मुद्दे