2010-10-28 24 views
8

मेरे पास एक पूर्णांक स्तंभ है जिसे मैं एक विदेशी कुंजी बाधा जोड़ना चाहता हूं। केवल समस्या यह है कि यदि उस कॉलम में मान/आवश्यकता नहीं है, तो डिफ़ॉल्ट रूप से MySQL एक '0' मान डालता है। यह स्पष्ट रूप से विदेशी कुंजी बाधा को तोड़ता है क्योंकि प्राथमिक तालिका में कोई रिकॉर्ड नहीं है 0.MySQL विदेशी कुंजी बाधा - इंटीजर कॉलम

मैं इस समस्या को कैसे दूर कर सकता हूं?

उत्तर

7

आप NULL मान स्वीकार करने के लिए अपनी विदेशी कुंजी सेट करना चाहते हैं, और 0 मान के बजाय NULL का उपयोग करें।

संकल्पनात्मक रूप से, NULL का अर्थ है अज्ञात मान गुम है। यदि आपकी पंक्ति "मान/आवश्यकता नहीं है", तो मेरा मानना ​​है कि NULL पूरी तरह से फिट बैठता है।

और हाँ, NULL मान आपकी विदेशी कुंजी बाधा को तोड़ नहीं देगा।

की एक बुनियादी उदाहरण का निर्माण करते हैं:

CREATE TABLE parents (
    id  int PRIMARY KEY, 
    value int 
) ENGINE = INNODB; 

CREATE TABLE children (
    id   int PRIMARY KEY, 
    parent_id int, 
    FOREIGN KEY (parent_id) REFERENCES parent (id) 
) ENGINE = INNODB; 

तब:

INSERT INTO parents VALUES (1, 100); 
Query OK, 1 row affected (0.00 sec) 

INSERT INTO children VALUES (1, 1); 
Query OK, 1 row affected (0.00 sec) 

INSERT INTO children VALUES (2, 0); 
ERROR 1452 (23000): A foreign key constraint fails 

INSERT INTO children VALUES (2, NULL); 
Query OK, 1 row affected (0.00 sec) 

SELECT * FROM children; 
+----+-----------+ 
| id | parent_id | 
+----+-----------+ 
| 1 |   1 | 
| 2 |  NULL | 
+----+-----------+ 
2 rows in set (0.01 sec) 
1

शायद आपके विदेशी कुंजी स्तंभ में nulls की अनुमति है और डिफ़ॉल्ट शून्य पर निर्धारित किया है।

2

हालांकि, लंबे और कठिन को उस FK कॉलम को शून्य होने की अनुमति देने के बारे में सोचें। नल का मतलब है कि आप माता-पिता के बिना बाल रिकॉर्ड कर सकते हैं। क्या यह वास्तव में एक वैध व्यापार मामला है? क्या आप एक उदाहरण दे सकते हैं जहां यह मान्य है?

इसके अलावा, एक शून्य FK (या किसी भी शून्य कॉलम) का अर्थ है कि अब आप शून्य के साधनों के बारे में धारणाएं बना रहे हैं। आप कैसे बताते हैं कि वास्तव में फ़ील्ड का मूल्य नहीं होना चाहिए, क्या कोई मूल्य डालना भूल रहा है? आप ऐप में नल लॉजिक को कार्यान्वित नहीं कर सकते हैं और इस तरह से इस मुद्दे को बाईपास कर सकते हैं, हालांकि इसमें अभी भी जोखिम शामिल हैं। मेरे मुकाबले बेहतर दिमाग ने कहा है कि नल की अनुमति कम स्थिर डेटाबेस डिज़ाइन का कारण बनती है। YMMV। शायद -1 जैसे डिफ़ॉल्ट मान पर विचार करें जो अभी भी एक शून्य एफके को मजबूर नहीं करता है और एक डमी रिकॉर्ड को देखता है।

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