বিদ্যমান সারণীতে বিদেশী কী যুক্ত করুন


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 টেবিল 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) নাল নয়"। আমি মাইএসকিউএল 5.1.61 ব্যবহার করছি। ম্যাকবুক প্রোতে মাইএসকিউএল ওয়ার্কবেঞ্চ (সর্বশেষতম) এর সাহায্যে এই অলটার ক্যোয়ারিকে সরিয়ে দেওয়ার চেষ্টা করা হচ্ছে।

সারণী বিবৃতি তৈরি করুন:

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) unsignedspracheনেই usignedঅংশ, তাই দুটি কলাম একই নয়।
এনবি

আপনি কি বোঝাতে চেয়েছেন যে উভয় প্রাথমিক ক্ষেত্র অবশ্যই ডেটা টাইপের হতে হবে?
frgtv10

2
এটি আপনার ডিজাইনের সমস্যা: প্রথমে আপনি দুটি auto_incrementকলাম উল্লেখ করছেন যা খারাপ। এছাড়াও, মাইএসকিউএল ম্যানুয়াল বলেছেন: 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.। সুতরাং, হ্যাঁ, অনুরূপ ডেটা টাইপ এবং একই চিহ্ন sign
এনবি

2
আমি দুটি স্বতঃসংযোগ ক্ষেত্র উল্লেখ করছি না। ক্যাটালগ.স্প্রেচ (অটো নয়) -> স্প্রেচ.আইডি (অটো)
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
@ পিক্সম্যাচ, উত্তর নেই। আপনি বিদেশী কী হিসাবে পূর্ণসংখ্যার স্বাক্ষর করতে পারেন। প্রশ্নটিতে এনবি যেমন উল্লেখ করেছে, ক্ষেত্রগুলির ধরণ এবং চিহ্নটি মেলাতে হবে। সুতরাং যদি অনুসন্ধান সারণিতে আপনার প্রাথমিক কীটি UNSIGNED হয়, তবে বিদেশী কী ক্ষেত্রটিও UNSIGNED হওয়া আবশ্যক। যদি প্রাথমিক কী ক্ষেত্রটি স্বাক্ষরিত হয় তবে বিদেশী কী ক্ষেত্রটিও স্বাক্ষর করতে হবে। এটি এইভাবে ভাবুন: এক টেবিলের কলাম যে কোনও শাবক তৈরি টেবিল হিসাবে সংজ্ঞায়িত করা হয়েছে, অন্য টেবিলেও তার একই সংজ্ঞা থাকা দরকার।
বেন কেইন

1
নোট করুন যে এটি একটি একক ক্যোয়ারী দিয়েও করা যেতে পারে (ব্যর্থতার ক্ষেত্রে আরও ভাল হতে পারে)
স্টিজন ডি উইট

6
আমাকে "SET FOREIGN_KEY_CHECKS = 0" চালাতে হয়েছিল; ADD CONSTRAINT কমান্ড চালানোর আগে বা এসকিউএল অভিযোগ করবে যে "একটি শিশু সারি যুক্ত বা আপডেট করতে পারে না: একটি বিদেশী কী বাধা ব্যর্থ হয়"।
এরিন গায়ার

2
না না শুধু দৌড়াবে "তে সেট FOREIGN_KEY_CHECKS = 0;" যদি আপনি "একটি বিদেশী কী বাধা ব্যর্থ হয়ে যায়" ত্রুটিটি পান তবে আপনার অবশ্যই স্পষ্টভাবে খারাপ ডেটা রয়েছে যা আপনাকে অবশ্যই ঠিক করতে হবে অন্যথায় আপনি লাইনটিতে বড় সমস্যা পেতে পারেন get
মেজেচাজার

72

কেবল এই ক্যোয়ারীটি ব্যবহার করুন, আমি আমার পরিস্থিতি অনুসারে এটি চেষ্টা করেছি এবং এটি ভালভাবে কাজ করে

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


15

এই লিঙ্কটি পরীক্ষা করুন। এটি আমাকে ইরানো 150 তে সহায়তা করেছে: http://vysimple.com/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/

আমার মাথার শীর্ষে দুটি জিনিস মাথায় আসে।

  • আপনার বিদেশী কী সূচকটি কি পুরো ডাটাবেসের একটি অনন্য নাম (তালিকার # 3)?
  • আপনি কি আপডেটটি টিকেট PK কে NUL এ সেট করার চেষ্টা করছেন (তালিকার # 5)?

আমি অনুমান করছি সমস্যাটি আপডেটের সাথে NUL সেটটি রয়েছে (যদি আমার মস্তিস্কগুলি আজ প্রায়শই থাকে না তবে তারা প্রায়ই ...)।

সম্পাদনা: আমি আপনার মূল পোস্টে মন্তব্য মিস করেছি। স্বাক্ষরযুক্ত / স্বাক্ষরবিহীন ইন কলামগুলি সম্ভবত আপনার কেস সমাধান করেছে। আশা করি আমার লিঙ্কটি ভবিষ্যতের চিন্তায় কাউকে সহায়তা করবে।


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

তবে আপনার টেবিলে রয়েছে:

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

এটা তোলে নাকিসুরে কারণ এটা না শূন্য হিসাবে সংজ্ঞায়িত করা হয় শূন্য কলাম Sprache সেট।


5

মাইএসকিউএল এই কোয়েরিটি সম্পাদন করবে:

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

আপনি যখন বিকল্প টেবিলে কোনও টেবিলে বিদেশী কী বাধা যুক্ত করেন, প্রথমে প্রয়োজনীয় সূচকগুলি তৈরি করতে ভুলবেন না।

  1. সূচী তৈরি করুন
  2. টেবিল পরিবর্তন করুন

আমি উভয়ের জন্য সূচক তৈরি করেছি। আমি যখন চালানোর চেষ্টা করি তখন পূর্বের মতো একই ত্রুটি বার্তাটি পাই। আমি যখন "আপডেট এ মুছে ফেলা" অংশটি অস্বীকার করি তখন এটি কাজ করে তবে ভুল "মুছে ফেলতে" "ক্রিয়া;) এর সাথে
frgtv10

@ 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

এটি মূলত ঘটে কারণ আপনার টেবিল দুটি পৃথক অক্ষরে রয়েছে। উদাহরণস্বরূপ চরসেট = utf-8 এবং অন্যান্য টেবিলগুলি CHARSET = latin1 এ তৈরি করা হয়েছে যাতে আপনি এই টেবিলগুলিতে foriegn কী যুক্ত করতে সক্ষম হতে চান। উভয় টেবিলগুলিতে একই চরসেট ব্যবহার করুন তারপরে আপনি 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
দয়া করে আপনার কোডটিতে এমন কিছু ব্যাখ্যা যুক্ত করুন যাতে অন্যরা এটি শিখতে পারে
নিকো হাজে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.