2010-03-02 18 views
138

उदाहरण के लिए, मेरे पास एक सारणी है जिसमें कई टेबल कॉलम हैं। मैं केवल एक अखंडता को मजबूर करने के लिए एक विदेशी कुंजी चाहता हूं अगर मैं वहां डेटा डालूं। यदि मैं उस कॉलम को पॉप्युलेट करने के लिए बाद में एक अद्यतन करता हूं तो यह अभी भी बाधा की जांच करेगा (यह संभवतः डेटाबेस सर्वर निर्भर है, मैं MySQL & InnoDB तालिका प्रकार का उपयोग कर रहा हूं)। मेरा मानना ​​है कि यह एक उचित उम्मीद है, लेकिन अगर मैं गलत हूं तो मुझे सही करें।क्या विदेशी कुंजी वाले टेबल कॉलम शून्य हो सकते हैं?

+6

मुझे MySQL के बारे में पता नहीं है, लेकिन एमएस एसक्यूएल सर्वर विदेशी कुंजी को आप चाहते हैं कि अर्थशास्त्र के साथ शून्य करने की अनुमति देता है। मुझे उम्मीद है कि यह मानक व्यवहार है। –

+0

विदेशी कुंजी, डिफ़ॉल्ट रूप से mySQL में शून्य नहीं हो सकता है, कारण सरल है, अगर आप कुछ संदर्भ देते हैं और आप इसे शून्य देते हैं, तो आप डेटा अखंडता खो देंगे। जब आप टेबल सेट बनाते हैं तो शून्य को अनुमति नहीं देते हैं और फिर विदेशी कुंजी बाधा लागू करते हैं। आप अपडेट पर शून्य सेट नहीं कर सकते हैं, इसे आपको एक त्रुटि भेजनी चाहिए, लेकिन आप (आपको अवश्य ही) इस कॉलम को अपडेट नहीं कर सकते हैं और केवल उन फ़ील्ड को अपडेट कर सकते हैं जिन्हें आपको बदलने की आवश्यकता है। – JoelBonetR

उत्तर

137

हां, आप केवल तभी लागू कर सकते हैं जब मान न्यूल न हो। यह आसानी से निम्न उदाहरण के साथ परीक्षण किया जा सकता है: क्योंकि हम parent_id में एक शून्य सम्मिलित

CREATE DATABASE t; 
USE t; 

CREATE TABLE parent (id INT NOT NULL, 
        PRIMARY KEY (id) 
) ENGINE=INNODB; 

CREATE TABLE child (id INT NULL, 
        parent_id INT NULL, 
        FOREIGN KEY (parent_id) REFERENCES parent(id) 
) ENGINE=INNODB; 


INSERT INTO child (id, parent_id) VALUES (1, NULL); 
-- Query OK, 1 row affected (0.01 sec) 


INSERT INTO child (id, parent_id) VALUES (2, 1); 

-- ERROR 1452 (23000): Cannot add or update a child row: a foreign key 
-- constraint fails (`t/child`, CONSTRAINT `child_ibfk_1` FOREIGN KEY 
-- (`parent_id`) REFERENCES `parent` (`id`)) 

पहले डालने पारित करेंगे। दूसरा डालने विदेशी कुंजी बाधा के कारण विफल रहता है, क्योंकि हमने parent तालिका में मौजूद कोई मान डालने का प्रयास नहीं किया है।

+14

अभिभावक तालिका को आईडी के साथ भी घोषित नहीं किया जा सकता है। – Will

+0

@CJDennis यदि आप इसे बनाते हैं तो केवल एक पंक्ति में शून्य आईडी हो सकती है, इसे अन्य पंक्तियों के लिए फ़ॉलबैक मान के रूप में उपयोग किया जा सकता है। (हालांकि यह डीबी के लिए बेहतर काम कर सकता है यदि आप केवल अधिक कॉलम का उपयोग करते हैं।) डिफ़ॉल्ट बाधा एक समस्या की तरह प्रतीत होती है यदि आप बाद में जानना चाहते हैं कि कोई मान मूल रूप से "डिफ़ॉल्ट" (शून्य का उपयोग करके) के रूप में सेट किया गया था या एक पर सेट किया गया था मान जो "डिफ़ॉल्ट" जैसा होता है। एक शून्य आईडी के साथ एक पंक्ति होने के द्वारा, आप स्पष्ट रूप से संकेत दे सकते हैं कि इस पंक्ति को सामान्य पंक्ति के रूप में उपयोग नहीं किया जाना चाहिए, और अन्य पंक्तियों के लिए गतिशील डिफ़ॉल्ट मान प्रदान करने के तरीके के रूप में पंक्ति का उपयोग कर सकते हैं। – Ouroborus

+0

मुझे लगता है कि 'parent_id INT NULL' हिस्सा 'verbosely)' parent_id int default null' – Chinggis6

2

हां, यह काम करेगा जैसा आप उम्मीद करते हैं। दुर्भाग्य से, मुझे MySQL manual में इसका स्पष्ट विवरण खोजने में परेशानी हो रही है।

विदेशी कुंजी का मतलब है कि मूल्य अन्य तालिका में मौजूद होना चाहिए। NULL मूल्य की अनुपस्थिति को संदर्भित करता है, इसलिए जब आप एक स्तंभ को न्यूल पर सेट करते हैं, तो उस पर बाधाओं को लागू करने का प्रयास करना समझ में नहीं आता है।

+0

डिज़ाइन द्वारा विदेशी कुंजी को कुछ महत्वपूर्ण (प्राथमिक) का संदर्भ देना चाहिए जो पूर्ण नहीं है, लेकिन विकास चरण के दौरान जब हमें पहले बच्चे के टेबल में डाला गया एकाधिक डेटा होना चाहिए, जिसे हम नहीं जानते कि यह किसके संदर्भ में होगा (मूल तालिका)। यही कारण है कि हमारे पास पूर्ण मूल्य की अनुमति है। उत्पादन में न्यूल एक डिजाइन प्रवाह होगा, जिसे मोटे तौर पर कहा जा सकता है। –

15

मैंने पाया कि जब डालने के दौरान, शून्य कॉलम मानों को विशेष रूप से NULL के रूप में घोषित किया जाना था, अन्यथा मुझे एक बाधा उल्लंघन त्रुटि (एक खाली स्ट्रिंग के विपरीत) प्राप्त होगी।

+5

के बराबर है, क्या आप इसे अनुमति देने के लिए कॉलम पर NULL का डिफ़ॉल्ट मान सेट नहीं कर सकते? –

+0

हां, ज्यादातर भाषाओं में NULL एक खाली स्ट्रिंग से अलग है। शायद शुरुआत करते समय सूक्ष्म, लेकिन याद रखने के लिए महत्वपूर्ण है। – Gary

+0

अरे बैकस्लाइडर, आप कहते हैं "(एक खाली स्ट्रिंग के विपरीत)", लेकिन मुझे नहीं लगता कि आपका मतलब है कि आप खाली स्ट्रिंग का मान डालेंगे, बल्कि यह कि आप मान के लिए कोई मान निर्दिष्ट नहीं करते हैं बिलकुल? यानी आप अपने 'INSERT INTO {table} {list_of_columns} 'में कॉलम का भी उल्लेख नहीं करते हैं? क्योंकि यह मेरे लिए सच है; कॉलम का उल्लेख छोड़ने से त्रुटि का कारण बनता है, लेकिन स्पष्ट रूप से NULL फिक्सेस त्रुटि को सेट करना और स्पष्ट रूप से सेट करना।अगर मैं सही हूं, तो मुझे लगता है कि @ गैरी की टिप्पणी लागू नहीं होती है (क्योंकि आपके पास खाली स्ट्रिंग का मतलब नहीं था), लेकिन @ केविन कौल्मबे की मददगार हो सकती है ... –

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