2013-01-03 39 views
6

नहीं डाल सकते हैं मैंने विदेशी कुंजी के साथ तालिका बनाई है और कुछ भी सम्मिलित नहीं कर सकता।विदेशी कुंजी समान तालिका के कॉलम संदर्भ। मूल्य

CREATE TABLE menus (

id int(10), 
parent_id int(10), 
label varchar(255), 
PRIMARY KEY (id), 
FOREIGN KEY (parent_id) REFERENCES menus (id) 
); 

मुझे माता-पिता हटा दिए जाने पर बच्चों को स्वचालित रूप से हटाने के लिए विदेशी कुंजी की आवश्यकता है। यह तालिका सफलतापूर्वक बनाई गई थी लेकिन मैं कुछ भी सम्मिलित नहीं कर सकता।

INSERT INTO `menus` (`parent_id`, `label`) 
VALUES ('1', 'label1'); 

या

INSERT INTO `menus` (`label`) 
VALUES ('label1'); 
#1452 - Cannot add or update a child row: a foreign key constraint fails 

मैं वास्तव में php कोड में किसी भी बच्चों के लिए लग रही है तो मैं किसी भी तरह 3 कॉलम के साथ सरल तालिका बनाने और स्वचालित रूप से भी सभी बच्चों और वे बच्चों ड्रॉप की जरूरत नहीं करना चाहती।

+2

आप कहते हैं कि आप "बच्चों को स्वचालित रूप से हटाएं" चाहते हैं, फिर भी आप हमें दिखाएंगे कि हम सभी आवेषण हैं। आपका प्रश्न वास्तव में क्या है? –

+3

आमतौर पर, आपको 'रूट' रिकॉर्ड को शून्य माता-पिता होने की अनुमति देने की आवश्यकता होगी - यानी 'menus.parent_id' को निरर्थक होना चाहिए, और' रूट 'मेनू आइटम में शून्य' parent_id' होगा। – StuartLC

+1

आईडी के लिए आप क्या मूल्य चाहते हैं? मैंने उनमें से कोई भी डाला या स्वत: उत्पन्न नहीं किया –

उत्तर

2

आमतौर पर, आपको 'रूट' रिकॉर्ड को शून्य माता-पिता होने की अनुमति देने की आवश्यकता होगी - यानी menus.parent_id शून्य होनी चाहिए, और 'रूट' मेनू आइटम में शून्य parent_id होगा।

यानी

बदलें करने के लिए अपने DDL:

parent_id int(10) NULL 

और फिर आप PARENT_ID

insert into `menus` (id, `label`, parent_id) 
VALUES (1, 'label1', null); 

तो फिर तुम बच्चे तत्वों के साथ जाने के लिए अच्छे हैं के रूप में शून्य के साथ अपने मूल तत्व जोड़ें:

insert into `menus` (id, `label`, parent_id) 
VALUES (2, 'subitem1', 1); 

आदि

SQL Fiddle here

+0

पर ऑटोइनक्रिकमेंट को याद किया है 'parent_id' पहले से ही शून्य (डिफ़ॉल्ट रूप से) है। जैसा कि आप कहते हैं, त्रुटि डालने के क्रम में त्रुटि सही है। –

+0

यह केवल आधा है, बच्चों की स्वत: हटाना गायब है: ओ) –

10

अपने सभी जरूरतों को आप इस संरचना

CREATE TABLE `menus` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `parent_id` int(11) unsigned DEFAULT NULL, 
    `label` varchar(255) NOT NULL DEFAULT '', 
    PRIMARY KEY (`id`), 
    KEY `fk_parent_menu` (`parent_id`), 
    CONSTRAINT `fk_parent_menu` FOREIGN KEY (`parent_id`) 
    REFERENCES `menus` (`id`) ON DELETE CASCADE ON UPDATE CASCADE 
); 
लेना चाहिए

SQL Fiddle DEMO

डेमो डालने और एक माता पिता के नोड

जादू ड्रॉप भाग के हटाने से पता चलता के लिए सभी बच्चों के लिए ON DELETE CASCADE

द्वारा किया जाता है
+0

काम नहीं करते, क्या आप निश्चित हैं? –

+0

@ गुडमुड क्या काम नहीं किया? –

+0

अपना डेमो देखें http://sqlfiddle.com/#!2/7646f –