2008-12-03 16 views
10

यहाँ मेरी मेज है:MySQL (InnoDB): स्तंभ हटाना और साथ विदेशी कुंजी बाधा और सूचकांक की जरूरत,

CREATE TABLE `alums_alumphoto` ( 
    `id` int(11) NOT NULL auto_increment, 
    `alum_id` int(11) NOT NULL, 
    `photo_id` int(11) default NULL, 
    `media_id` int(11) default NULL, 
    `updated` datetime NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `alums_alumphoto_alum_id` (`alum_id`), 
    KEY `alums_alumphoto_photo_id` (`photo_id`), 
    KEY `alums_alumphoto_media_id` (`media_id`), 
    CONSTRAINT `alums_alumphoto_ibfk_1` FOREIGN KEY (`media_id`) REFERENCES `media_mediaitem` (`id`), 
    CONSTRAINT `alum_id_refs_id_706915ea` FOREIGN KEY (`alum_id`) REFERENCES `alums_alum` (`id`), 
    CONSTRAINT `photo_id_refs_id_63282119` FOREIGN KEY (`photo_id`) REFERENCES `media_mediaitem` (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=63 DEFAULT CHARSET=utf8 

मैं स्तंभ photo_id, जो संभवतः भी विदेशी कुंजी बाधा को हटाने की आवश्यकता होगी हटाना चाहते हैं और अनुक्रमणिका।

ERROR 1025 (HY000): Error on rename of '.\dbname\#sql-670_c5c' to '.\dbname\alums_alumphoto' (errno: 150)

... जब मैं सूचकांक (ऊपर के रूप में ही) ड्रॉप करने की कोशिश, और जब मैं विदेशी ड्रॉप करने का प्रयास करें:

समस्या

कि मैं त्रुटियों मिल जब मैं स्तंभ ड्रॉप करने की कोशिश है मुख्य बाधा:

ERROR 1091 (42000): Can't DROP 'photo_id_refs_id_63282119'; check that column/key exists)

मुझे यह सब किस क्रम में करना चाहिए? मुझे किस सटीक आदेश का उपयोग करना चाहिए?

+0

क्या आपने समान चेतावनी कथन में कॉलम और अनुक्रमणिका दोनों को छोड़ने का प्रयास किया है? – staticsan

उत्तर

7

निश्चित बात यह है कि डुप्लिकेट टेबल बनाना है।

> CREATE TABLE alums_alumphoto_new LIKE alums_alumphoto; 
> ALTER TABLE .... // Drop constraint 
> ALTER TABLE .... // Drop KEY 
> ALTER TABLE .... // Drop the column 
> INSERT INTO alums_alumphoto_new (SELECT id, alum_id, photo_id, media_id, updated FROM alums_alumphoto); 
> RENAME TABLE alums_alumphoto TO alums_alumphoto_old, alums_alumphoto_new TO alums_alumphoto; 

वहाँ क्रियान्वित तालिका का नाम एक त्रुटि है, तो कुछ अन्य तालिकाओं विदेशी कुंजी इस तालिका, ऐसी स्थिति में इस पूरे दृष्टिकोण बेवकूफ है संदर्भित की कमी हो सकती है। :)

25

को सटीकता से, इस प्रयास करें:

पहले ड्रॉप विदेशी कुंजी या बाधा:

ALTER TABLE `alums_alumphoto` DROP FOREIGN KEY `photo_id_refs_id_63282119`; 

पिछला आदेश स्तंभ पर विदेशी कुंजी बाधा को हटा।

ALTER TABLE `alums_alumphoto` DROP COLUMN `photo_id`; 

Aternatively, आप एक में इन 2 आपरेशन जोड़ सकता:

ALTER TABLE `alums_alumphoto` 
    DROP FOREIGN KEY `photo_id_refs_id_63282119` , 
    DROP COLUMN `photo_id`; 
0

ड्रॉप कुंजी संयोजन का प्रयास अब आप स्तंभ photo_id (सूचकांक स्तंभ छोड़ने पर MySQL द्वारा हटा दिया जाता) ड्रॉप कर सकते हैं और ड्रॉ विदेशी कुंजी कथन।

ALTER TABLE `alums_alumphoto` 
    DROP KEY KEY `alums_alumphoto_photo_id`, 
    DROP FOREIGN KEY `photo_id_refs_id_63282119`; 

ALTER TABLE `alums_alumphoto` 
    DROP COLUMN `photo_id`;