विदेशी कुंजी क्षेत्र और संदर्भ का प्रकार और परिभाषा बराबर होनी चाहिए। इसका मतलब यह है कि आपकी विदेशी कुंजी आपके क्षेत्र के प्रकार को बदल देती है।
एक समाधान यह होगा:
LOCK TABLES
favorite_food WRITE,
person WRITE;
ALTER TABLE favorite_food
DROP FOREIGN KEY fk_fav_food_person_id,
MODIFY person_id SMALLINT UNSIGNED;
अब आप बदल सकते हैं person_id
ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;
विदेशी कुंजी को पुनः बनाएँ
ALTER TABLE favorite_food
ADD CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
REFERENCES person (person_id);
UNLOCK TABLES;
संपादित करें:
ऊपर दिए गए ताले, टिप्पणियों के लिए धन्यवाद
ऐसा करते समय आपको डेटाबेस को लिखना बंद करना होगा, अन्यथा आप डेटा अखंडता समस्याओं का जोखिम उठाते हैं।
मैंने ऊपर एक राइट लॉक जोड़ा है
आपके ( INSERT, UPDATE, DELETE
) के अलावा किसी भी अन्य सत्र में सभी लेखन क्वेरीज़ समय-सीमा तक प्रतीक्षा करेंगी या UNLOCK TABLES
; निष्पादित किया जाता है
http://dev.mysql.com/doc/refman/5.5/en/lock-tables.html
EDIT 2: ओपी ने रेखा के बारे में और अधिक विस्तृत विवरण के लिए कहा "विदेशी कुंजी क्षेत्र और संदर्भ की परिभाषा और परिभाषा बराबर होनी चाहिए। इसका मतलब है कि आपकी विदेशी कुंजी आपके क्षेत्र के प्रकार को बदल रही है।"
से विदेशी कुँजी प्रतिबंध: MySQL 5.5 संदर्भ मैनुअल
विदेशी कुंजी में संदर्भित कॉलम और संदर्भित कुंजी में समान आंतरिक डेटा प्रकार होना चाहिए, ताकि इनको एक प्रकार के रूपांतरण के बिना तुलना की जा सके। पूर्णांक प्रकारों का आकार और संकेत समान होना चाहिए। स्ट्रिंग प्रकारों की लंबाई समान होने की आवश्यकता नहीं है। गैर-चरित्र (वर्ण) स्ट्रिंग कॉलम के लिए, वर्ण सेट और टकराव समान होना चाहिए।