MySQL विदेशी कुंजी बाधा नहीं बना सकता है


87

मुझे mysql डेटाबेस में मौजूदा तालिका में एक विदेशी कुंजी बनाने में कुछ समस्याएं आ रही हैं।

मेरे पास तालिका है exp:

+-------------+------------------+------+-----+---------+-------+
| Field       | Type             | Null | Key | Default | Extra |
+-------------+------------------+------+-----+---------+-------+
| EID         | varchar(45)      | NO   | PRI | NULL    |       |
| Comment     | text             | YES  |     | NULL    |       |
| Initials    | varchar(255)     | NO   |     | NULL    |       |
| ExpDate     | date             | NO   |     | NULL    |       |
| InsertDate  | date             | NO   |     | NULL    |       |
| inserted_by | int(11) unsigned | YES  | MUL | NULL    |       |
+-------------+------------------+------+-----+---------+-------+

और मैं sample_dfनिम्नलिखित का उपयोग करते हुए इसे संदर्भित करते हुए एक नई तालिका बनाने के लिए तैयार नहीं था :

CREATE TABLE sample_df (
df_id mediumint(5) unsigned AUTO_INCREMENT primary key,
sample_type mediumint(5) unsigned NOT NULL,
df_10 BOOLEAN NOT NULL,
df_100 BOOLEAN NOT NULL,
df_1000 BOOLEAN NOT NULL,
df_above_1000 BOOLEAN NOT NULL,
target INT(11) unsigned NOT NULL,
assay MEDIUMINT(5) unsigned zerofill NOT NULL,
insert_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
inserted_by INT(11) unsigned NOT NULL,
initials varchar(255),
experiment VARCHAR(45),
CONSTRAINT FOREIGN KEY (inserted_by) REFERENCES user (iduser),
CONSTRAINT FOREIGN KEY (target) REFERENCES protein (PID),
CONSTRAINT FOREIGN KEY (sample_type) REFERENCES sample_type (ID),
CONSTRAINT FOREIGN KEY (assay) REFERENCES assays (AID),
CONSTRAINT FOREIGN KEY (experiment) REFERENCES exp (EID)
);

लेकिन मुझे त्रुटि मिलती है:

ERROR 1215 (HY000): Cannot add foreign key constraint

मैंने कुछ और जानकारी प्राप्त करने के लिए:

SHOW ENGINE INNODB STATUS\G

जिससे मुझे मिला:

FOREIGN KEY (experiment) REFERENCES exp (EID)
):
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.

मेरे लिए कॉलम के प्रकार मेल खाते हैं, क्योंकि वे दोनों वर्कर (45) हैं। (मैंने experimentकॉलम को अशक्त न करने की कोशिश भी की , लेकिन यह ठीक नहीं हुआ) इसलिए मुझे लगता है कि समस्या यही होनी चाहिए Cannot find an index in the referenced table where the referenced columns appear as the first columns। लेकिन मुझे पूरा यकीन नहीं है कि इसका क्या मतलब है, या इसे कैसे जांचना / ठीक करना है। क्या किसी के पास कोई सुझाव है? और क्या मतलब है first columns?


11
कहीं भी किसी भी उत्तर या प्रश्न में, क्या मैं यह पता लगाने में सक्षम था कि यह त्रुटि चरित्र सेट में अंतर के कारण हो सकती है। धन्यवाद .. चीयर्स !!!
प्रॉपरस

3
इसके अलावा, अपने कॉलम कोलेशन को दोबारा जांचें। आपकी तालिका utf8mb4 हो सकती है, लेकिन कॉलम में एक अलग टकराव हो सकता है!
वॉटसन

मेरे मामले में @Watson charset लेकिन आप मुझे सोच पाने के लिए मेरा उत्थान करते हैं।
user2910265

जवाबों:


155

बस इसे संभावित कारणों के मिश्रण में फेंकते हुए, मैं इसमें भाग गया जब संदर्भित तालिका स्तंभ में समान "प्रकार" था, लेकिन समान हस्ताक्षर नहीं थे।

मेरे मामले में, संदर्भित तालिका कॉलिन टिनिअंट यूनिस्ड थी और मेरा संदर्भ तालिका स्तंभ टिनिनेट नामित था। दोनों कॉलम संरेखित करने से समस्या हल हो गई।


2
@ Austen-hoogen द्वारा सुझाए गए समाधान ने मेरी समस्या को हल कर दिया है। लेकिन कम प्रतिष्ठा स्कोर के कारण मैं उसके समाधान के लिए वोट करने और टिप्पणी करने में असमर्थ हूं। मेरे मामले में प्राथमिक कुंजी पूर्णांक, ऑटो वेतन वृद्धि और अहस्ताक्षरित थी। लेकिन विदेशी कुंजी (संदर्भित तालिका का कॉलम) पर हस्ताक्षर किए गए थे। मैंने इसे अहस्ताक्षरित में बदल दिया और सफलतापूर्वक संबंध बनाने में सक्षम हो गया।
बाल सिंह

हां, उसी मुद्दे से गुजरा। मेरी प्राथमिक कुंजी BIGINT (20) थी, और मेरी दूसरी संदर्भित तालिका में INT (10) अहस्ताक्षरित थी। हम सुनिश्चित करते हैं कि वे सभी मैच करें। अर्थात। BIGINT (20), और संदर्भित तालिका में BIGINT (20) भी होना चाहिए
मंजूनाथ रेड्डी

धन्यवाद! इस समाधान से मेरी समस्या भी हल हो गई! मेरे पास intउस तालिका में था जहां मैं दूसरी तालिका में विदेशी कुंजी और बिगिन सेट करने की योजना बना रहा था।
अरबी_शेरबाक

38

यह त्रुटि तब भी हो सकती है, यदि संदर्भ तालिका और वर्तमान तालिका में समान वर्ण सेट नहीं है।


3
स्थापित करने के बाद वर्ण सेट के रूप में latinसंदर्भित तालिका में तो मैं 3hrs के बाद फिर से सांस शुरू कर दिया।
अभिषेक कमल

धन्यवाद। यह एक तुच्छ मुद्दा नहीं है
Ventoh

24

Http://dev.mysql.com/doc/refman/5.5/en/create-table-foreign-keys.html के अनुसार

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

InnoDB किसी भी इंडेक्स कॉलम या कॉलम के समूह को संदर्भित करने के लिए एक विदेशी कुंजी की अनुमति देता है। हालांकि, संदर्भित तालिका में, एक सूचकांक होना चाहिए जहां संदर्भित कॉलम उसी क्रम में पहले कॉलम के रूप में सूचीबद्ध हैं।

इसलिए यदि संदर्भित तालिका में सूचकांक मौजूद है और यह कई स्तंभों से समाहित है, और वांछित कॉलम पहले नहीं है, तो त्रुटि उत्पन्न होगी।

निम्नलिखित नियम के उल्लंघन के कारण हमारी त्रुटि का कारण था:

विदेशी कुंजी में संदर्भित कॉलम और संदर्भित कुंजी में समान डेटा प्रकार होना चाहिए। पूर्णांक प्रकारों का आकार और संकेत समान होना चाहिए। स्ट्रिंग प्रकारों की लंबाई समान होने की आवश्यकता नहीं है। Nonbinary (चरित्र) स्ट्रिंग कॉलम के लिए, वर्ण सेट और टकराव समान होना चाहिए।


20

जैसा कि @Anton उल्लेख किया गया है, यह विभिन्न डेटा प्रकारों के कारण हो सकता है। मेरे मामले में मेरे पास प्राथमिक कुंजी (20) थी और INT (10) के साथ महत्वपूर्ण कुंजी सेट करने की कोशिश की


2
धन्यवाद! इसी तरह की समस्या जहां मैं INT (11) के साथ INT (11) का उपयोग कर रहा था, लेकिन एक प्राथमिक कुंजी थी और इस तरह अहस्ताक्षरित था जबकि दूसरे पर हस्ताक्षर किए गए थे!
माइकल स्कॉट


7

मेरा संदर्भ तालिका के बीच एक टकराव का मुद्दा था और तालिका बनाई जानी थी, इसलिए मुझे उस कुंजी का कोलाज प्रकार स्पष्ट रूप से निर्धारित करना था जिसे मैं संदर्भित कर रहा था।

  • पहले मैंने इसके टकराव प्रकार को पाने के लिए संदर्भित तालिका में एक क्वेरी चलाई
show table STATUS like '<table_name_here>';
  • फिर मैंने निर्माण क्वेरी में collation type और स्पष्ट रूप से कर्मचारी_id के collation type को कॉपी किया। मेरे मामले में यह utf8_general_ci था
CREATE TABLE dbo.sample_db
(
  id INT PRIMARY KEY AUTO_INCREMENT,
  event_id INT SIGNED NOT NULL,
  employee_id varchar(45) COLLATE utf8_general_ci NOT NULL,
  event_date_time DATETIME,
  CONSTRAINT sample_db_event_event_id_fk FOREIGN KEY (event_id) REFERENCES event (event_id),
  CONSTRAINT sample_db_employee_employee_id_fk FOREIGN KEY (employee_id) REFERENCES employee (employee_id)
);


2

प्राथमिक कुंजी का सटीक क्रम भी बीच में कोई अतिरिक्त स्तंभों के साथ मेल खाना चाहिए।

मेरे पास एक प्राथमिक कुंजी सेटअप था जहां कॉलम ऑर्डर वास्तव में मेल खाता है, लेकिन समस्या यह थी कि प्राथमिक कुंजी में एक अतिरिक्त कॉलम था जो संदर्भ तालिका की विदेशी कुंजी का हिस्सा नहीं है

उदाहरण के लिए) टेबल 2, कॉलम (ए, बी, सी) -> टेबल 1, कॉलम (ए, बी, डी, सी) - आईआईएस नाखून

मुझे प्राथमिक कुंजी स्तंभों को फिर से व्यवस्थित करना पड़ा ताकि न केवल वे उसी तरह से ऑर्डर करें, बल्कि बीच में कोई अतिरिक्त कॉलम न हो:

उदाहरण) टेबल 2, कॉलम (ए, बी, सी) -> टेबल 1, कॉलम (ए, बी, सी, डी) - इस तरह


2

कुछ मामलों में, मुझे संदर्भित फ़ील्ड को प्राथमिक कुंजी के रूप में परिभाषित करने के शीर्ष पर अद्वितीय बनाना था।

लेकिन मैंने पाया कि इसे यूनीक के रूप में परिभाषित नहीं करना हर मामले में समस्या पैदा नहीं करता है। मैं हालांकि परिदृश्यों का पता नहीं लगा पाया हूं। शायद अशक्त परिभाषा के साथ कुछ करना है।


क्या आपने एफके या मैनुअल का परिचय पढ़ा है? एक FK एक UNIQUE का संदर्भ देता है; पीके का मतलब होता है UNIQUE NOT NULL।
फिलीपिक्सी

2

मेरे मामले में उपयोग कर बनाया गया पूर्णांक आईडी के लिए, और संदर्भित तालिका का उपयोग कर एक विदेशी कुंजी डिफ़ॉल्ट रूप से निर्माण कर रहा bigint

मेरे रेल एप्लिकेशन में यह एक बड़ा दुःस्वप्न था क्योंकि माइग्रेशन विफल हो गया था लेकिन फ़ील्ड वास्तव में DB में बनाए गए थे, इसलिए उन्होंने DB में दिखाया लेकिन रेल एप्लिकेशन के स्कीमा में नहीं।


1

एक ही बाधा में एक से अधिक बार एक ही कॉलम को संदर्भित करना भी इस Cannot find an index in the referenced tableत्रुटि को पैदा करता है , लेकिन बड़ी तालिकाओं पर स्पॉट करना मुश्किल हो सकता है। बाधाओं को विभाजित करें और यह उम्मीद के मुताबिक काम करेगा।


1

मेरी भी यही त्रुटि थी। कोई भी जवाब मुझे नहीं मिला। मेरे मामले में, मेरा GUI स्वचालित रूप से एक प्राथमिक विशिष्ट पहचानकर्ता के साथ "अनसाइनड" के रूप में एक टेबल बनाता है। यह तब विफल होता है जब मैं प्रयास करता हूं और एक विदेशी कुंजी बनाता हूं और मुझे ठीक वही त्रुटि देता है। मेरी प्राथमिक कुंजी को सौंपा जाना चाहिए।

यदि आप एसक्यूएल को इस तरह लिखते हैं id int unique auto_incrementतो आपके पास यह समस्या नहीं है लेकिन किसी कारण से मेरा जीयूआई इसके बजाय ऐसा करता है id int unassigned unique auto_increment

आशा है कि यह किसी और को सड़क पर लाने में मदद करेगा।


1

मेरे लिए यह सिर्फ डीबी की देन था। मैं utf8_unicode_ci और कार्यों में बदल गया


1
क्या आप इस बात का उदाहरण शामिल कर सकते हैं कि वर्तमान वर्णक्रम / टकराव की जाँच कैसे करें?
thelr
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.