मौजूदा तालिका में विदेशी कुंजी जोड़ें


324

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

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

जब मैं ऐसा करने की कोशिश करता हूं, मुझे यह त्रुटि संदेश मिलता है:

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

INNODB स्थिति में त्रुटि:

120405 14:02:57 टेबल मैजेबल की विदेशी कुंजी बाधा में त्रुटि। # 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 कार्यक्षेत्र (नवीनतम) के साथ इस बदलाव की कोशिश कर रहा है।

तालिका बनाएं विवरण:

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
चूँकि आपने इसका आउटपुट पोस्ट नहीं किया था SHOW CREATE TABLE, मैं केवल पूछ सकता हूँ - क्या स्तंभ का नाम वास्तव में आईडी है, अपरकेस?
एनबी

खैर, अब हाजिर होना आसान है - katalogहै int(11) unsigned। भाग spracheनहीं है usigned, इसलिए दो कॉलम समान नहीं हैं।
एनबी

क्या आपका मतलब है, दोनों प्राथमिक क्षेत्र समान डेटा प्रकार होने चाहिए?
frgtv10

2
यह आपके डिज़ाइन के साथ समस्या है: सबसे पहले, आप दो auto_incrementकॉलमों का संदर्भ दे रहे हैं जो खराब है। इसके अलावा, MySQL मैनुअल कहता है Corresponding columns in the foreign key and the referenced key must have similar internal data types inside InnoDB so that they can be compared without a type conversion. The size and sign of integer types must be the same. The length of string types need not be the same. For nonbinary (character) string columns, the character set and collation must be the same.:। इसलिए, हाँ, समान डेटा प्रकार और समान संकेत।
एनबी

2
मैं दो auto_increment फ़ील्ड नहीं संदर्भित कर रहा हूँ। Order.Sprache (ऑटो नहीं) -> sprache.ID (ऑटो)
frgtv10

जवाबों:


559

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

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);

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

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

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

6
मुझे "SET FOREIGN_KEY_CHECKS = 0;" चलाना था। ADD CONSTRAINT कमांड चलाने से पहले या SQL शिकायत करेगा "चाइल्ड रो को जोड़ने या अपडेट नहीं कर सकता: एक विदेशी कुंजी बाधा विफल"।
एरिन गीयर

2
है सिर्फ चलाने "सेट FOREIGN_KEY_CHECKS = 0;" अगर आपको "एक विदेशी कुंजी बाधा विफल" त्रुटि मिलती है, तो आपके पास निश्चित रूप से खराब डेटा है जिसे आपको ठीक करना होगा अन्यथा आपको लाइन के नीचे बड़ी समस्याएं मिलेंगी।
बजे तक भूलभुलैया

72

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

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


15

इस लिंक की जाँच करें। इसने मुझे गलत 150 के साथ मदद की है: http://verysimple.com/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/

मेरे सिर के ऊपर दो चीजें दिमाग में आती हैं।

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

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

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


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

लेकिन आपकी तालिका में है:

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

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


5

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;

चीयर्स!


5

कैसे ठीक करना है Error Code: 1005. Can't create table 'mytable.#sql-7fb1_7d3a' (errno: 150) in mysql.

  1. अपनी तालिका में परिवर्तन करें और इसमें एक सूचकांक जोड़ें ..

    ALTER TABLE users ADD INDEX index_name (index_column)
  2. अब इसमें कसाव डालें

    ALTER TABLE foreign_key_table
    ADD CONSTRAINT foreign_key_name FOREIGN KEY (foreign_key_column)
    REFERENCES primary_key_table (primary_key_column) ON DELETE NO ACTION
    ON UPDATE CASCADE;

ध्यान दें कि यदि आप एक सूचकांक नहीं जोड़ते हैं तो यह काम नहीं करेगा।

लगभग 6 घंटे तक इससे जूझने के बाद मैं इस समाधान के साथ आया, मुझे आशा है कि यह एक आत्मा को बचा लेगा।


4

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

  1. सूचकांक बनाएँ
  2. तालिका में परिवर्तन

मैंने दोनों के लिए सूचकांक बनाया। जब मैं चलाने की कोशिश करता हूं तो मुझे पहले जैसा ही त्रुटि संदेश मिलता है। जब मैं "ऑन डिलीट ऑन अपडेट" के भाग का
खुलासा

@ frgtv10 सबसे अधिक संभावना है कि टेबल डेटा "डिलीट" के साथ संघर्ष करता है।
मैक्सिमम पोल्श्चा

3

सभी एक क्वेरी में प्रयास करें

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

0

यह मूल रूप से होता है क्योंकि आपकी तालिकाएं दो अलग-अलग वर्णों में होती हैं। एक उदाहरण के रूप में charset = utf-8 और अन्य तालिकाओं में बनाई गई एक तालिका CHARSET = latin1 में बनाई गई है ताकि आप इन तालिकाओं में foriegn कुंजी जोड़ सकें। दोनों टेबलों में एक ही चारसेट का उपयोग करें, फिर आप फ़ॉरेगन कीज़ जोड़ पाएंगे। त्रुटि 1005 foriegn कुंजी बाधा गलत तरीके से बनाई गई इस से हल कर सकते हैं


0

मैं उसी समस्या से गुज़रा। मेरे मामले में मेरे पास पहले से ही डेटा है और इस तालिका में कुंजी थी जो संदर्भ तालिका में मौजूद नहीं थी। इसलिए मुझे इस पंक्तियों को हटाना पड़ा जो बाधाओं और हर काम का अनादर करता था।


0

चरण 1: इस स्क्रिप्ट को चलाएँ

SET FOREIGN_KEY_CHECKS=0;

चरण 2: कॉलम जोड़ें

ALTER TABLE mileage_unit ADD COLUMN COMPANY_ID BIGINT(20) NOT NULL

चरण 3: जोड़े गए कॉलम में विदेशी कुंजी जोड़ें

ALTER TABLE mileage_unit
ADD FOREIGN KEY (COMPANY_ID) REFERENCES company_mst(COMPANY_ID);

चरण 4: इस स्क्रिप्ट को चलाएँ

SET FOREIGN_KEY_CHECKS=1;

-1
 ALTER TABLE TABLENAME ADD FOREIGN KEY (Column Name) REFERENCES TableName(column name)

उदाहरण:-

ALTER TABLE Department ADD FOREIGN KEY (EmployeeId) REFERENCES Employee(EmployeeId)

1
कृपया अपने कोड में कुछ स्पष्टीकरण जोड़ें, ताकि अन्य लोग इससे सीख सकें
निको हासे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.