2010-07-18 14 views
6

क्या विदेशी कुंजी को परिभाषित करना भी एक सूचकांक को परिभाषित करता है? मेरे पास mysql v5.1.46 & है, मैं MySQL व्यवस्थापक उपकरण देख रहा हूं और यह इंडेक्स के रूप में विदेशी कुंजी दिखाता है, इसलिए मैं पुष्टि करना चाहता था?MySQL विदेशी कुंजी प्रश्न

उत्तर

3

हां, जब आप एक विदेशी कुंजी बाधा परिभाषित करते हैं तो MySQL 5.1 स्वचालित रूप से संदर्भ तालिका पर एक अनुक्रमणिका बनाता है। MySQL को रेफरेंसिंग टेबल और विदेशी कुंजी के लिए संदर्भित तालिका दोनों पर एक इंडेक्स की आवश्यकता होती है।

नोट करें कि सूचकांक स्वचालित रूप से संदर्भित तालिका पर केवल बनाया गया है, और संदर्भित तालिका पर नहीं।

CREATE TABLE orders (
    id int PRIMARY KEY, 
    code int, 
    name varchar(10) 
) ENGINE=INNODB; 

CREATE TABLE order_details (
    detail_id int PRIMARY KEY, 
    order_code int, 
    value int, 
    FOREIGN KEY (order_code) REFERENCES orders(code) 
) ENGINE=INNODB; 

ERROR 1005 (HY000): Can't create table 'test.order_details' 

यह जब से तुम अक्सर विदेशी कुंजी की कमी का संदर्भ बनाने होगी, बहुत आम नहीं है: MySQL आप संदर्भित तालिका में एक क्षेत्र का संदर्भ देता है एक विदेशी कुंजी है कि एक सूचकांक का उपयोग नहीं कर सकते हैं बनाने के लिए अनुमति नहीं दी जाएगी संदर्भित तालिका की प्राथमिक कुंजी, और प्राथमिक कुंजी स्वचालित रूप से अनुक्रमित की जाती हैं। हालांकि यह ध्यान में रखना उचित है।

orders तालिका के code मैदान पर एक सूचकांक बनाया जा रहा है समस्या का समाधान होगा:

CREATE INDEX ix_orders_code ON orders(code); 
8
  • यदि पहले से ही एक प्रयोग करने योग्य सूचकांक (एक सूचकांक जहां विदेशी कुंजी स्तंभ पहले स्तंभ के रूप में सूचीबद्ध किया गया है है उसी क्रम में) तो एक नई अनुक्रमणिका नहीं बनाई गई है।
  • यदि कोई उपयोग करने योग्य अनुक्रमणिका नहीं है तो एक विदेशी कुंजी बनाने से भी एक अनुक्रमणिका तैयार होती है।

यह documentation में शामिल है।

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

+0

प्रलेखन के लिए पुराने पुराने लिंक को ठीक किया गया। –

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