2012-04-05 18 views
178

मैं "katalog" नामक तालिका में एक विदेशी कुंजी जोड़ना चाहता हूं। InnoDB स्थिति मेंमौजूदा तालिका में विदेशी कुंजी जोड़ें

Error Code: 1005. Can't create table 'mytable.#sql-7fb1_7d3a' (errno: 150) 

त्रुटि::

ALTER TABLE katalog 
ADD CONSTRAINT `fk_katalog_sprache` 
FOREIGN KEY (`Sprache`) 
REFERENCES `Sprache` (`ID`) 
ON DELETE SET NULL 
ON UPDATE SET NULL; 

जब मैं यह करने के लिए प्रयास करते हैं, मैं इस त्रुटि संदेश मिलता है

120405 14:02:57 करने में त्रुटि तालिका mytable की विदेशी कुंजी बाधा। # sql-7fb1_7d3a:

FOREIGN KEY (`Sprache`) 
REFERENCES `Sprache` (`ID`) 
ON DELETE SET NULL 
ON UPDATE SET NULL: 
Cannot resolve table name close to: 
(`ID`) 
ON DELETE SET NULL 
ON UPDATE SET NULL 

जब मैं कार्रवाई "हटाने पर" इस ​​क्वेरी यह काम करता है का उपयोग करें, लेकिन गलत के साथ:

ALTER TABLE `katalog` 
ADD FOREIGN KEY (`Sprache`) REFERENCES `sprache` (`ID`) 

दोनों तालिकाओं InnoDB हैं और दोनों क्षेत्रों रहे हैं "INT (11) रिक्त नहीं"। मैं MySQL 5.1.61 का उपयोग कर रहा हूँ। मैकबुक प्रो पर MySQL वर्कबेंच (नवीनतम) के साथ इस ALTER क्वेरी को आग लगाने का प्रयास कर रहा है।

तालिका कथन बनाएं:

CREATE TABLE `katalog` (
`ID` int(11) unsigned NOT NULL AUTO_INCREMENT, 
`Name` varchar(50) COLLATE utf8_unicode_ci NOT NULL, 
`AnzahlSeiten` int(4) unsigned NOT NULL, 
`Sprache` int(11) NOT NULL, 
PRIMARY KEY (`ID`), 
UNIQUE KEY `katalogname_uq` (`Name`) 
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=DYNAMIC$$ 

CREATE TABLE `sprache` (
`ID` int(11) NOT NULL AUTO_INCREMENT, 
`Bezeichnung` varchar(45) NOT NULL, 
PRIMARY KEY (`ID`), 
UNIQUE KEY `Bezeichnung_UNIQUE` (`Bezeichnung`), 
KEY `ix_sprache_id` (`ID`) 
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 
+1

चूंकि आपने 'शो क्रिएट टेबल' के आउटपुट को पोस्ट नहीं किया है, इसलिए मैं केवल पूछ सकता हूं - क्या कॉलम नाम वास्तव में आईडी है, ऊपरी है? –

+0

मैंने इसे ऊपर जोड़ा। – frgtv10

+0

अच्छा, अब स्पॉट करना आसान है - 'katalog' में int (11) हस्ताक्षरित' है। 'sprache' में' usign' भाग नहीं है, इसलिए दो कॉलम समान नहीं हैं। –

उत्तर

314

एक मौजूदा टेबल में एक विदेशी कुंजी (grade_id) को जोड़ने के लिए (उपयोगकर्ता), निम्न चरणों का पालन करें:

ALTER TABLE users ADD grade_id SMALLINT UNSIGNED NOT NULL DEFAULT 0; 
ALTER TABLE users ADD CONSTRAINT fk_grade_id FOREIGN KEY (grade_id) REFERENCES grades(id); 
+7

कारण मुझे समझने और याद रखने में मदद करते हैं। ऐसा इसलिए है क्योंकि आप एक गैर-हस्ताक्षरित फ़ील्ड में कोई विदेशी कुंजी नहीं जोड़ सकते हैं, सही? – PixMach

+5

@PixMach, जवाब नहीं है। आप विदेशी कुंजी के रूप में पूर्णांक पर हस्ताक्षर कर सकते हैं। एनबी के रूप में प्रश्न पर ध्यान दिया गया है, फ़ील्ड के प्रकार और चिह्न से मिलान करने की आवश्यकता है। इसलिए यदि लुकअप टेबल में आपकी प्राथमिक कुंजी अनसुलझा है, तो विदेशी कुंजी फ़ील्ड को भी हस्ताक्षर किया जाना चाहिए। यदि प्राथमिक कुंजी फ़ील्ड साइन किया गया है, तो विदेशी कुंजी फ़ील्ड पर भी हस्ताक्षर किए जाने चाहिए। इस बारे में सोचें: किसी भी तालिका में जो भी स्तंभ दिखाया गया है उसे तालिका बनाने के रूप में परिभाषित किया गया है, इसे अन्य तालिका में एक ही परिभाषा की आवश्यकता है। –

+1

ध्यान दें कि यह एक प्रश्न के साथ भी किया जा सकता है (विफलता आदि के मामले में बेहतर हो सकता है) –

3

आप ALTER तालिका का उपयोग कर एक मेज के लिए एक विदेशी कुंजी बाधा जोड़ते हैं, पहले आवश्यक अनुक्रमणिका बनाने के लिए याद है।

  1. सूचकांक
  2. ऑल्टर तालिका
+0

मैंने दोनों के लिए सूचकांक बनाया। जब मैं दौड़ने की कोशिश करता हूं तो मुझे पहले जैसा ही त्रुटि संदेश मिलता है। जब मैं "अपडेट पर डिलीट पर" भाग को अस्वीकार करता हूं तो यह काम करता है लेकिन गलत "हटाने पर" कार्रवाई के साथ;) – frgtv10

+0

@ frgtv10 सबसे अधिक संभावना है कि टेबल डेटा "हटाएं" के साथ संघर्ष करता है। –

13

जांच के लिए इस लिंक बनाएँ। इससे मुझे 150: http://verysimple.com/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/

मेरे सिर के शीर्ष पर दो चीजें दिमाग में आ गई हैं।

  • क्या आपकी विदेशी कुंजी इंडेक्स पूरे डेटाबेस में एक अद्वितीय नाम है (सूची में # 3)?
  • क्या आप तालिका पर पीके को एनयूएलएल पर सेट करने की कोशिश कर रहे हैं (सूची में # 5)?

मुझे लगता है कि समस्या अद्यतन पर सेट के साथ है (यदि मेरे दिमाग आज के पीछे नहीं हैं क्योंकि वे अक्सर होते हैं ...)।

संपादित करें: मुझे आपकी मूल पोस्ट पर टिप्पणियां याद आईं। बिना हस्ताक्षरित/हस्ताक्षरित int कॉलम आपके मामले को हल कर सकते हैं। आशा है कि मेरा लिंक भविष्य में विचार में किसी की मदद करेगा।

10
FOREIGN KEY (`Sprache`) 
REFERENCES `Sprache` (`ID`) 
ON DELETE SET NULL 
ON UPDATE SET NULL; 

लेकिन अपने टेबल है:

CREATE TABLE `katalog` (
`Sprache` int(11) NOT NULL, 

यह नहीं कर सकते कॉलम स्प्रे को NULL पर सेट करें क्योंकि इसे न्यूल के रूप में परिभाषित किया गया है।

45

बस इस क्वेरी का उपयोग, मैं इसे अपने परिदृश्य के अनुसार की कोशिश की है और यह अच्छी तरह से काम करता है

ALTER TABLE katalog ADD FOREIGN KEY (`Sprache`) REFERENCES Sprache(`ID`); 
0

एक क्वेरी में सभी की कोशिश

ALTER TABLE users ADD grade_id SMALLINT UNSIGNED NOT NULL DEFAULT 0, 
     ADD CONSTRAINT fk_grade_id FOREIGN KEY (grade_id) REFERENCES grades(id); 
9

सरल कदम ...

ALTER TABLE t_name1 ADD FOREIGN KEY (column_name) REFERENCES t_name2(column_name) 
1

MySQL इस क्वेरी को निष्पादित करेगा:

ALTER TABLE `db`.`table1` 
ADD COLUMN `col_table2_fk` INT UNSIGNED NULL, 
ADD INDEX `col_table2_fk_idx` (`col_table2_fk` ASC), 
ADD CONSTRAINT `col_table2_fk1` 
FOREIGN KEY (`col_table2_fk`) 
REFERENCES `db`.`table2` (`table2_id`) 
ON DELETE NO ACTION 
ON UPDATE NO ACTION; 

चीयर्स!

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