2010-06-11 16 views
8

SQLite द्वारा लागू नहीं होने वाली निम्नलिखित विदेशी कुंजी बाधा (हालांकि ठीक निष्पादित) क्यों है? मैं रिश्ते को लागू करने के बारे में कैसे जा सकता हूं?विदेशी कुंजी लागू नहीं की जा रही है

CREATE TABLE User (
    UserID TEXT Unique NOT NULL PRIMARY KEY, 
    FirstName TEXT NOT NULL, 
    LastName TEXT NOT NULL, 
    Username TEXT NOT NULL, 
    Password TEXT NOT NULL, 
    Email TEXT NOT NULL, 
    SignupDate TEXT NOT NULL 
) 

CREATE TABLE Category (
    CategoryID TEXT Unique NOT NULL PRIMARY KEY, 
    UserID TEXT, 
    FOREIGN KEY(UserID) REFERENCES User(UserID) 
) 

उत्तर

12

the relevant docs के रूप में कहते हैं (अनुभाग 2. विदेशी कुंजी समर्थन को सक्षम करने में):

Assuming the library is compiled with foreign key constraints enabled, it must still be enabled by the application at runtime, using the PRAGMA foreign_keys command. For example:

sqlite> PRAGMA foreign_keys = ON;

Foreign key constraints are disabled by default (for backwards compatibility), so must be enabled separately for each database connection separately.

आपको लगता है कि प्रासंगिक सिलसिले में PRAGMA इस्तेमाल किया है? (मान लीजिए, जैसे दस्तावेज़ कहते हैं, कि स्क्लाइट उचित रूप से संकलित किया गया है, और हाल ही में पर्याप्त कुंजी संस्करण विदेशी कुंजी बाधा प्रवर्तन प्रदान करने के लिए भी है)।

+0

आप त्वरित प्रतिक्रिया के लिए बहुत बहुत धन्यवाद। मैंने कभी नहीं देखा कि दस्तावेज में (अगली बार कड़ी मेहनत होगी)। उस आदेश को चलाने का प्रयास करने के बाद मुझे निम्न त्रुटि मिलती है: "SQLite तैयार() विफल रहा। त्रुटि: प्राधिकरण ने अस्वीकार कर दिया विवरण: अधिकृत अभिव्यक्ति नहीं: PRAGMA विदेशी_की = चालू;" मुझे लगता है कि वे जिस संस्करण का उपयोग कर रहे हैं उसका समर्थन नहीं करता है या कार्यक्षमता अक्षम कर दी गई है। क्या मैं ट्रिगर्स का उपयोग कर एक ही अंतिम परिणाम बना सकता हूं? यदि ऐसा है तो कृपया SQLITE के लिए कुछ उदाहरण ट्रिगर सिंटैक्स प्रदान कर सकते हैं? –

+0

@ मैक्सिम, मेरा मानना ​​है कि स्क्लाइट विदेशी कुंजी ट्रिगरों को बिल्कुल समान अंतर्निहित कार्यक्षमता की आवश्यकता होती है क्योंकि सादे पुरानी विदेशी कुंजी होती है (अक्सर स्क्लाइट के एम्बेडेड बिल्डों में हटा दी जाती है जो कि "पूर्ण रिलेशनल एसीआईडी ​​पावर" पेश करने के बजाय छोटे और तेज़ होने की इच्छा रखते हैं पर्याप्त प्रदर्शन और पदचिह्न लागत)। –

3

तुम भी connectionstring में एम्बेड के माध्यम से विदेशी कुंजी समर्थन चालू कर सकते हैं:

foreign keys=True 

उदाहरण:

"Data Source={DatabaseFullFilePath};Version=3;foreign keys=True;datetimeformat=CurrentCulture" 
संबंधित मुद्दे