মাইএসকিউএল ত্রুটি 1215: বিদেশী কী সীমাবদ্ধতা যুক্ত করতে পারে না


335

আমি আমার নতুন স্কিমাটি আমার ডিবি সার্ভারে ফরোয়ার্ড করার চেষ্টা করছি, তবে আমি কেন এই ত্রুটিটি পাচ্ছি তা বুঝতে পারি না। আমি এখানে উত্তরটি অনুসন্ধান করার চেষ্টা করেছি, তবে আমি যা কিছু পেয়েছি তা ডিবি ইঞ্জিনকে ইনোডবকে সেট করতে বলেছে বা বিদেশী কী হিসাবে যে কীগুলি ব্যবহার করতে চাইছি তা তাদের নিজস্ব টেবিলে প্রাথমিক কীগুলি রয়েছে তা নিশ্চিত করার জন্য । আমি ভুল না হলে এই দুটি জিনিসই করেছি। আপনি ছেলেরা যে অন্য কোন সহায়তা দিতে পারে?

Executing SQL script in server

ERROR: Error 1215: Cannot add foreign key constraint

-- -----------------------------------------------------
-- Table `Alternative_Pathways`.`Clients_has_Staff`
-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients_has_Staff` (
  `Clients_Case_Number` INT NOT NULL ,
  `Staff_Emp_ID` INT NOT NULL ,
  PRIMARY KEY (`Clients_Case_Number`, `Staff_Emp_ID`) ,
  INDEX `fk_Clients_has_Staff_Staff1_idx` (`Staff_Emp_ID` ASC) ,
  INDEX `fk_Clients_has_Staff_Clients_idx` (`Clients_Case_Number` ASC) ,
  CONSTRAINT `fk_Clients_has_Staff_Clients`
    FOREIGN KEY (`Clients_Case_Number` )
    REFERENCES `Alternative_Pathways`.`Clients` (`Case_Number` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_Clients_has_Staff_Staff1`
    FOREIGN KEY (`Staff_Emp_ID` )
    REFERENCES `Alternative_Pathways`.`Staff` (`Emp_ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

এসকিউএল স্ক্রিপ্টের সম্পাদন শেষ হয়েছে: বিবৃতি: 7 সফল হয়েছে, 1 ব্যর্থ হয়েছে

এখানে প্যারেন্ট টেবিলগুলির জন্য এসকিউএল রয়েছে।

CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients` (
  `Case_Number` INT NOT NULL ,
  `First_Name` CHAR(10) NULL ,
  `Middle_Name` CHAR(10) NULL ,
  `Last_Name` CHAR(10) NULL ,
  `Address` CHAR(50) NULL ,
  `Phone_Number` INT(10) NULL ,
  PRIMARY KEY (`Case_Number`) )
ENGINE = InnoDB

CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Staff` (
  `Emp_ID` INT NOT NULL ,
  `First_Name` CHAR(10) NULL ,
  `Middle_Name` CHAR(10) NULL ,
  `Last_Name` CHAR(10) NULL ,
  PRIMARY KEY (`Emp_ID`) )
ENGINE = InnoDB

6
অভিভাবক সারণীগুলির জন্য দয়া করে স্কিমা পোস্ট করুন: Clientsএবং Staff
আইকে ওয়াকার


1
@ ডেনিস সম্ভবত এটি কোনও সদৃশ নয় কারণ ওপি বলছে যে তারা যাচাই করেছে যে কলামগুলি প্যারেন্ট টেবিলগুলিতে পিকে রয়েছে।
আইকে ওয়াকার

আমি অনুরোধ অনুসারে ক্লায়েন্ট এবং স্টাফ টেবিলের জন্য এসকিউএল স্টেটমেন্ট যুক্ত করেছি।
রবার্ট বি

উত্তর:


592

আমি অনুমান করছি Clients.Case_Numberএবং এবং / এবং Staff.Emp_IDঠিক তেমন ডেটা টাইপ হিসাবে Clients_has_Staff.Clients_Case_Numberএবং হয় না Clients_has_Staff.Staff_Emp_ID

প্যারেন্ট টেবিলের কলামগুলি সম্ভবত INT UNSIGNED?

উভয় টেবিলগুলিতে তাদের ঠিক একই ধরণের ডেটা টাইপ হওয়া দরকার।


10
ধন্যবাদ। এটি ইস্যুতে পরিণত হয়েছিল। স্টাফ.এম্প_আইডি একটি ছোট ছিল, যখন রেফারেন্সিং কলামটি আইএনটি ছিল। কখনও কখনও এটি ছোট জিনিস ...
রবার্ট বি

Tks। আমার ক্ষেত্রে আমি ভুলক্রমে শিশু টেবিলে বিদেশী কীতে "জিরোফিল" ক্লিক করেছি যার অর্থ এটি পিতামাতার টেবিলের কলামের সাথে ঠিক মেলে না।
wwkudu

12
এটি এমনও হতে পারে যে চরিত্রের সেটটি আলাদা। আমি এই সমস্যাটি হ্যাড করেছি যেখানে একটি কলামে utf8 অক্ষর সেট ছিল এবং অন্যটিতে ল্যাটিন 1 ছিল। ALTER TABLE TableCHARACTER SET = utf8 দিয়ে সহজেই সংশোধন করা হয়েছে ; এবং টেবিল Deviceপরিবর্তন কলম ID IDচর (36) চরিত্র সেট 'utf8' নকল নয়;
www.jensolsson.se 26'15

3
@ www.jensolsson.se আপনি সঠিক, পিকে যদি এক বা একাধিক স্ট্রিং কলাম অন্তর্ভুক্ত থাকে তবে তাদের অবশ্যই একই অক্ষর সেট এবং কোলেশন ব্যবহার করতে হবে । এই সুনির্দিষ্ট ক্ষেত্রে পিকে INT ছিল সুতরাং সারণী এবং / অথবা কলামগুলির অক্ষর সেট প্রাসঙ্গিক ছিল না।
আইকে ওয়াকার

2
কোলেশনটি আমার ইস্যু, লাতিন 1 বনাম ইউটিএফ 8 (টেবিল এবং কলামটি দেখুন)।
ben_979

244

যে কারণে আপনি একটি বিদেশী কী বাধা ত্রুটি পেতে পারেন:

  1. আপনি সমস্ত টেবিলগুলিতে ইঞ্জিন হিসাবে InnoDB ব্যবহার করছেন না।
  2. আপনি লক্ষ্য টেবিলের একটি অস্তিত্বমূলক কীটি উল্লেখ করার চেষ্টা করছেন। নিশ্চিত করুন যে এটি একটি তা নিশ্চিত করুন চাবি অন্যান্য টেবিলের উপর (এটি একটি প্রাথমিক বা অনন্য কী হতে পারে)
  3. কলামগুলির প্রকারগুলি এক রকম নয় (ব্যতিক্রমটি রেফারেন্সিং টেবিলের কলামটি ছোট হতে পারে)।
  4. যদি পিকে / এফকে একটি বার্চার হয় তবে নিশ্চিত হয়ে নিন যে উভয়ের জন্য কোলেশন সমান।

হালনাগাদ:

  1. এর অন্যতম কারণ হতে পারে যে কলামটি আপনি ব্যবহার করছেন ON DELETE SET NULLতা নাল হিসাবে সংজ্ঞায়িত করা হয়নি। সুতরাং কলামটি ডিফল্ট নাল সেট করা আছে তা নিশ্চিত করুন।

এগুলি পরীক্ষা করুন।


14
আমি কেবল যুক্ত করব যে যদি এফকে একটি চরিত্রের কলামে থাকে তবে আমি মনে করি তাদের একই চরসেট এবং সমষ্টি হতে হবে। (অথবা সম্ভবত 1-বাইট এবং 2-বাইট চার্সেট সামঞ্জস্যপূর্ণ নয়))
গ্রাহাম চার্লস

5
আমার কারণটি ছিল আপনার প্রথম নির্দেশিত একটি "দুটি টেবিলের জন্য আলাদা ডিবি ইঞ্জিন, ইনোডিবি এবং মাইআইএসএএম"
রণদিকা বিষ্মান

7
আমি আর একটি কারণ পেয়েছি =) - UP `UP আপডেট সেট আপ বাতিল করার পরে নাল:` `` আপনি একটি সেট নাল শর্তটি নির্ধারণ করেছেন যদিও কিছু কলামগুলি নাল নয় হিসাবে সংজ্ঞায়িত করা হয়েছে। সুতরাং, আমি কেবল এফকে সংজ্ঞা ঠিক করেছি।
আলেক্স্লিউ

1
লক্ষ্য ব্যতীত সূচকের অনুপস্থিতিও সম্ভব ব্যর্থতা ।
পল টি। রাউকেন

1
চমৎকার, চতুর্থ পয়েন্টটি আমার সমস্যা ছিল। এটি এক ধরনের বাজে - তবে আমি খুব খুশি মাইএসকিএল এর জন্য ক্র্যাশ করেছিলাম
সেবাস

85

অন্যদের ক্ষেত্রে একই ত্রুটি সর্বদা কলামের ধরণের অমিলের কারণে নাও হতে পারে, আপনি কমান্ড জারি করে একটি mysql foriegn কী ত্রুটি সম্পর্কে আরও তথ্য সন্ধান করতে পারেন

SHOW ENGINE INNODB STATUS;

আপনি মুদ্রিত বার্তার শীর্ষের কাছাকাছি এমন কিছু ত্রুটি পেতে পারেন

রেফারেন্সযুক্ত সারণীতে সূচকটি খুঁজে পাওয়া যায় না যেখানে রেফারেন্সযুক্ত কলামগুলি প্রথম কলাম হিসাবে উপস্থিত হয়, বা সারণীতে কলামের ধরণ এবং রেফারেন্সযুক্ত সারণি সীমাবদ্ধতার জন্য মেলে না।


13
এটি ডায়াগনস্টিককে সহায়তা করে বলে মনে করি এটিই সেরা উত্তর! ধন্যবাদ।
আলেক্স্ল্যু

কিভাবে কাজ করা উচিত? একটি সারিতে উভয় প্রশ্ন চালানো?
সি

@ সি 4 ইউ, হ্যাঁ আমাদের প্রথম সারির হিসাবে ইঞ্জিন ইনোডব স্ট্যাটাস দেখাতে এবং তারপরে অন্যান্য প্রশ্নগুলি অনুসরণ করে উভয় প্রশ্নগুলি কার্যকর করা উচিত
নিশ্চিত করুন

পিএইচপিএমআইএডমিনে এটি করা কার্যকর হবে না। কমান্ড প্রম্পটে এটি করুন।
রুয়ান800

13

ত্রুটি 1215 একটি বিরক্তিকর। বিস্ফোরণ পিলের উত্তরটি মৌলিক বিষয়গুলিকে অন্তর্ভুক্ত করে। আপনি সেখান থেকে শুরু নিশ্চিত করতে চান। যাইহোক, আরও অনেক সূক্ষ্ম কেস সন্ধানের জন্য রয়েছে:

উদাহরণস্বরূপ, আপনি যখন বিভিন্ন টেবিলের প্রাথমিক কীগুলি সংযুক্ত করার চেষ্টা করছেন, সঠিক ON UPDATEএবং ON DELETEবিকল্পগুলি সরবরাহ করার বিষয়টি নিশ্চিত করুন। উদাহরণ:

...
PRIMARY KEY (`id`),
FOREIGN KEY (`id`) REFERENCES `t` (`other_id`) ON DELETE SET NULL
....

উড়বে না, কারণ প্রাথমিক কী (যেমন id) হতে পারে না NULL

আমি নিশ্চিত, এই ধরণের বাধা যুক্ত করার সময় আরও অনেকগুলি অনুরূপ সূক্ষ্ম সমস্যা রয়েছে, যার কারণেই যখন সীমাবদ্ধতা ত্রুটিগুলি অতিক্রম করে, সর্বদা নিশ্চিত করে রাখি যে সীমাবদ্ধতা এবং তার প্রভাবগুলি আপনার বর্তমান প্রসঙ্গে বোঝায়। আপনার ত্রুটি 1215 এর জন্য শুভকামনা!


1
আপনি যদি নেই এমন কোনও বিদেশী কী মুছে ফেলার চেষ্টা করেন তবে আপনি এই ত্রুটিটি পেয়ে যাবেন :)
বিস্ফোরণ পিলগুলি

2
এছাড়াও, দস্তাবেজগুলি থেকে: মাইএসকিউএলকে বিদেশী কী এবং রেফারেন্সকৃত কীগুলিতে সূচকের প্রয়োজন হয় যাতে বিদেশী কী চেকগুলি দ্রুততর হয় এবং টেবিল স্ক্যানের প্রয়োজন না হয়। রেফারেন্সিং সারণীতে অবশ্যই একটি সূচক থাকতে হবে যেখানে বিদেশী কী কলামগুলি একই ক্রমের প্রথম কলাম হিসাবে তালিকাভুক্ত থাকে । রেফারেন্সিং টেবিলের অস্তিত্ব না থাকলে স্বয়ংক্রিয়ভাবে এ জাতীয় সূচক তৈরি হয়। এই সূচকটি নীরবে পরে বাদ যাবে, যদি আপনি অন্য সূচি তৈরি করেন যা বিদেশী কী সীমাবদ্ধতা প্রয়োগ করতে ব্যবহার করা যেতে পারে। সূচক_নাম, যদি দেওয়া হয়, পূর্বে বর্ণিত হিসাবে ব্যবহৃত হয়।
জোনাথন এম

1
আমি এখানে আসার কারণ: আমি যে ON DELETE SET NULLকলামে থাকতে চাইছিলাম তাতে একটি বিদেশী কী তৈরি করার চেষ্টা করেছি NOT NULL। ধরুন আপনি নিজের পিষ্টক নাও খেয়ে নিতে পারবেন না।
মার্টিন হেনিংস

8

টেবিলের কোলেশন SHOW TABLE STATUSপরীক্ষা করুন , ব্যবহার করে আপনি কোলেশন সহ টেবিলগুলি সম্পর্কে তথ্য পরীক্ষা করতে পারেন।

উভয় টেবিলের সমান কোলেশন থাকতে হবে।

এটা আমার সাথে হয়েছে।


এটি আমার ক্ষেত্রে সমস্যা ছিল - মাইএসকিউএল ত্রুটি মোটেই সহায়ক নয়!
9:30 এ জডলিং

7

আমার ক্ষেত্রে, আমি একটি টেবিল মুছে দেওয়া ব্যবহার SET FOREIGN_KEY_CHECKS=0, তারপর SET FOREIGN_KEY_CHECKS=1পরে। আমি যখন টেবিলটি পুনরায় লোড করতে গেলাম, তখন পেয়েছি error 1215। সমস্যাটি ছিল ডেটাবেজে অন্য একটি সারণী ছিল যার টেবিলে একটি বিদেশী কী ছিল যা আমি মুছে ফেলেছিলাম এবং পুনরায় লোড করছিলাম। পুনরায় লোডিং প্রক্রিয়ার একটি অংশ ক্ষেত্রগুলির মধ্যে একটির জন্য ডেটা ধরণের পরিবর্তন জড়িত, যা অন্য সারণী থেকে বিদেশী কীকে অবৈধ করে তুলেছিল, এইভাবে ট্রিগার করে error 1215। আমি জড়িত ফিল্ডের জন্য নতুন ডেটা টাইপ সহ অন্যান্য টেবিলটি ড্রপ করে এবং আবার লোড করে সমস্যার সমাধান করেছি।


5

একটি fk যোগ করার চেষ্টা করার সময় আমি একই ত্রুটি পেয়েছি। আমার ক্ষেত্রে সমস্যাটি এফকে টেবিলের পিকে দ্বারা তৈরি হয়েছিল যা স্বাক্ষরবিহীন হিসাবে চিহ্নিত হয়েছিল।


5

লারভেল 4 ব্যবহার করার সময়, বিশেষত জেফরিওয়ের লারাভেল 4 জেনারেটরের সাথে "ত্রুটি 1215: বিদেশী কী সীমাবদ্ধতা যুক্ত করতে পারছি না" এমন একটি সমস্যা রয়েছে।

লারাভেল ৪-এ, আপনি জেফরিওয়ের জেনারেটরগুলি টেবিলগুলি একের পর এক তৈরির জন্য মাইগ্রেশন ফাইলগুলি তৈরি করতে ব্যবহার করতে পারেন, যার অর্থ, প্রতিটি মাইগ্রেশন ফাইল একটি সারণী উত্পন্ন করে। আপনার প্রতি সচেতন হতে হবে যে প্রতিটি মাইগ্রেশন ফাইলটি ফাইলের একটি টাইমস্ট্যাম্প দিয়ে তৈরি করা হয়, যা ফাইলগুলিকে অর্ডার দেয়। প্রজন্মের ক্রম হ'ল মাইগ্রেশন অপারেশনের ক্রমও যখন আপনি আর্টিজান সিএলআই কমান্ড "পিএইচপি আর্টিসান মাইগ্রেট" চালিত করেন। সুতরাং, যদি কোনও ফাইল কোনও কীটির উল্লেখ করে কোনও বিদেশী কী বাধার জন্য জিজ্ঞাসা করে যা কোনও পরবর্তী ফাইলটিতে উত্পন্ন হয় তবে তা এখনও হয়নি, ত্রুটি 1215 মুছে ফেলা হয়। এই ক্ষেত্রে, আপনাকে যা করতে হবে তা হ'ল মাইগ্রেশন ফাইল তৈরির ক্রম সামঞ্জস্য করা। যথাযথ ক্রমে নতুন ফাইলগুলি তৈরি করুন, সামগ্রীটি অনুলিপি করুন, তারপরে বিশৃঙ্খল পুরানো ফাইলগুলি মুছুন।


3

আমার একই সমস্যা ছিল, আমার সমাধান:

আগে:

CREATE TABLE EMPRES
( NoFilm smallint NOT NULL

  PRIMARY KEY (NoFilm)

  FOREIGN KEY (NoFilm) REFERENCES cassettes

);

সমাধান:

CREATE TABLE EMPRES
(NoFilm smallint NOT NULL REFERENCES cassettes,

 PRIMARY KEY (NoFilm)

);

আমি আশা করি এটি সাহায্য করবে;)


1
আপনি আপনার প্রথম
ক্রেটিতে

3

আমারও একই সমস্যা ছিল।
আমি এটি করে এটি সমাধান করেছি:

আমি নিম্নলিখিত লাইন তৈরি
primary key: (id int(11) unsigned NOT NULL AUTO_INCREMENT)

আমার স্কিমা বিল্ডারে একটি টেবিল আমদানির চেষ্টা করার পরে আমি এই সমাধানটি খুঁজে পেয়েছি। যদি এটি আপনার পক্ষে কাজ করে তবে আমাকে জানান!

শুভকামনা!

ফিলিপ টার্কিও


3

আমি কেবল এই মামলাটি যুক্ত করতে চেয়েছিলাম VARCHAR বিদেশী কী সম্পর্কের । আমি মাইএসকিউএল ওয়ার্কবেঞ্চ ৮.০ এ এটি বের করার চেষ্টা করে গত সপ্তাহটি ব্যয় করেছি এবং শেষ পর্যন্ত ত্রুটিটি ঠিক করতে সক্ষম হয়েছি।

সংক্ষিপ্ত উত্তর: স্কিমা, টেবিল, কলাম, রেফারেন্সিং সারণী, রেফারেন্সিং কলাম এবং অন্য যে কোনও সারণীর সাথে প্যারেন্ট সারণির রেফারেন্সের চরিত্র সেট এবং সমষ্টি রয়েছে to

দীর্ঘ উত্তর: আমার টেবিলে একটি ENUM ডেটাটাইপ ছিল। আমি এটিতে পরিবর্তিত হয়েছি VARCHARএবং আমি রেফারেন্স টেবিল থেকে মানগুলি পেতে পারি যাতে অতিরিক্ত বিকল্পগুলি যুক্ত করতে আমাকে পিতামাতার টেবিলটি পরিবর্তন করতে না হয়। এই বিদেশী-কী সম্পর্কটি সোজা মনে হয়েছিল তবে আমি 1215 ত্রুটি পেয়েছি। আরভিন্ডের উত্তর এবং নীচের লিঙ্কটি ব্যবহারের পরামর্শ দিয়েছে

SHOW ENGINE INNODB STATUS;

এই কমান্ডটি ব্যবহার করার সময় আমি কোনও অতিরিক্ত সহায়ক তথ্য না দিয়ে ত্রুটির জন্য নিম্নলিখিত ভার্বোজের বর্ণনা পেয়েছি

রেফারেন্সড সারণীতে সূচকটি খুঁজে পাওয়া যায় না যেখানে রেফারেন্সযুক্ত কলামগুলি প্রথম কলাম হিসাবে উপস্থিত হয়, বা সারণীতে কলামের ধরণ এবং রেফারেন্সযুক্ত সারণি সীমাবদ্ধতার জন্য মেলে না। নোট করুন যে ENUM এবং SET এর অভ্যন্তরীণ স্টোরেজ প্রকারটি> = InnoDB-4.1.12 দিয়ে তৈরি টেবিলগুলিতে পরিবর্তিত হয়েছে এবং পুরানো টেবিলগুলিতে এই জাতীয় কলামগুলি নতুন টেবিলগুলিতে এই জাতীয় কলামগুলি উল্লেখ করা যায় না। সঠিক বিদেশী কী সংজ্ঞা জন্য দয়া করে http://dev.mysql.com/doc/refman/8.0/en/innodb-foreign-key-constraints.html দেখুন

যা আমি ব্যবহৃত SET FOREIGN_KEY_CHECKS=0;হিসাবে দ্বারা প্রস্তাবিত অরবিন্দ ভরদ্বাজ এবং লিঙ্ক এখানে :

এটি নিম্নলিখিত ত্রুটি বার্তা দিয়েছে:

ত্রুটি কোড: 1822. বিদেশী কী সীমাবদ্ধতা যুক্ত করতে ব্যর্থ। সীমাবদ্ধতার জন্য অনুপস্থিত সূচক

এই মুহুর্তে, আমি স্কিমাটি 'বিপরীত প্রকৌশলী'-এড করেছি এবং আমি ইআর ডায়াগ্রামে বিদেশী-কী সম্পর্ক তৈরি করতে সক্ষম হয়েছি। 'ফরওয়ার্ড ইঞ্জিনিয়ার'-ইন-এ, আমি নিম্নলিখিত ত্রুটিটি পেয়েছি:

1452 ত্রুটি: একটি শিশু সারিতে যোগ বা আপডেট করতে পারে না: একটি বিদেশী কী বাধা ব্যর্থ হয়

যখন আমি ইআরআর ডায়াগ্রামকে নতুন স্কিমে 'ফরওয়ার্ড ইঞ্জিনিয়ার'-এডিট করব তখন এসকিউএল স্ক্রিপ্টটি সমস্যা ছাড়াই চলে ran ইঞ্জিনিয়ারকে ফরওয়ার্ড করার প্রয়াস থেকে উত্পন্ন এসকিউএল তুলনা করার সময়, আমি আবিষ্কার করেছি যে পার্থক্যটি চরিত্রের সেট এবং কোলেশন। প্যারেন্ট টেবিল, চাইল্ড টেবিল এবং দুটি কলামে utf8mb4অক্ষর সেট এবং সমষ্টি ছিল utf8mb4_0900_ai_ci, তবে, পিতামাতার টেবিলে অন্য কলামটি ব্যবহার করে রেফারেন্স করা হয়েছিলCHARACTER SET = utf8 , COLLATE = utf8_bin ; আলাদা চাইল্ড টেবিলটি ।

পুরো স্কিমার জন্য, আমি সমস্ত টেবিল এবং সমস্ত কলামের জন্য ক্যারেক্টার সেট এবং কোলেশনটিকে নিম্নলিখিতটিতে পরিবর্তন করেছি:

CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;

এটি শেষ পর্যন্ত আমার সমস্যাটি 1215 ত্রুটি দিয়ে সমাধান করেছে।

পার্শ্ব দ্রষ্টব্য: কোলেশন utf8mb4_general_ciমাইএসকিউএল ওয়ার্কবেঞ্চ 5.0 বা তার পরে কাজ করে। কোলেশন utf8mb4_0900_ai_ciকেবল মাইএসকিউএল ওয়ার্কবেঞ্চ 8.0 বা ততোধিকের জন্য কাজ করে। আমি বিশ্বাস করি যে ক্যারেক্টার সেট এবং কোলেশন নিয়ে আমার যে সমস্যাগুলির মধ্যে একটি ছিল তা মাইএসকিউএল ওয়ার্কবেঞ্চের মধ্যে 8.0 এ আপগ্রেড হওয়ার কারণে। এখানে এই লিঙ্কটি সম্পর্কে আরও আলোচনা করা একটি লিঙ্ক is


2

আমি এই ত্রুটিটি খুঁজে পাচ্ছি না

CREATE TABLE RATING (

Riv_Id INT(5),
Mov_Id INT(10) DEFAULT 0,
Stars INT(5),
Rating_date DATE, 

PRIMARY KEY (Riv_Id, Mov_Id),

FOREIGN KEY (Riv_Id) REFERENCES REVIEWER(Reviewer_ID)
ON DELETE SET NULL ON UPDATE CASCADE,

FOREIGN KEY (Mov_Id) REFERENCES MOVIE(Movie_ID)
ON DELETE SET DEFAULT ON UPDATE CASCADE
)

2

কলামগুলির ধরণ এক রকম না হলে এটিও ঘটে।

উদাহরণস্বরূপ, আপনি যে কলামটি উল্লেখ করছেন সেটি যদি UNSIGNED INT হয় এবং কলামটি উল্লেখ করা হয় INT হয় তবে আপনি এই ত্রুটিটি পান।


2

মাইএসকিউএল (আইএনএনওডিবি) এর জন্য ... আপনি যে কলামগুলিকে লিঙ্ক করতে চান তার সংজ্ঞা পান

SELECT * FROM information_schema.columns WHERE 
TABLE_NAME IN (tb_name','referenced_table_name') AND 
COLUMN_NAME  IN ('col_name','referenced_col_name')\G

উভয় কলাম সংজ্ঞা আছে তুলনা এবং যাচাই করুন

একই COLUMN_TYPE (দৈর্ঘ্য), একই COLATION

মত খেলতে সহায়ক হতে পারে

set foreign_key_checks=0;
ALTER TABLE tb_name ADD FOREIGN KEY(col_name) REFERENCES ref_table(ref_column) ON DELETE ...
set foreign_key_checks=1;

2

টেবিলের সামঞ্জস্যের জন্য পরীক্ষা করুন। উদাহরণস্বরূপ, যদি একটি টেবিল হয় MyISAMএবং অন্যটি হয় InnoDB, আপনার কাছে এই সমস্যা থাকতে পারে।


2

অন্য কারণ: আপনি যদি বিদেশী কীতে ব্যবহৃত ON DELETE SET NULL সমস্ত কলাম ব্যবহার করেন তবে অবশ্যই নাল মানকে মঞ্জুরি দিন। অন্য কেউ এই প্রশ্নের মধ্যে এটি খুঁজে পেয়েছে ।

আমার বোঝার থেকে এটি ডেটা অখণ্ডতা সম্পর্কিত কোনও সমস্যা হবে না তবে এটি মনে হয় যে মাইএসকিউএল কেবল এই বৈশিষ্ট্যটি সমর্থন করে না (5.7-এ)।


1

যখন এই ত্রুটি দেখা দেয় কারণ রেফারেন্সযুক্ত টেবিলটি মাইআইএসএএম ইঞ্জিন ব্যবহার করে এই উত্তরটি আপনার ডাটাবেসকে রূপান্তর করার জন্য একটি দ্রুততর উপায় সরবরাহ করে যাতে সমস্ত জ্যাঙ্গো মডেলের টেবিলগুলি InnoDB ব্যবহার করে: https://stackoverflow.com/a/15389961/2950621

এটি একটি জ্যাঙ্গো ম্যানেজমেন্ট কমান্ড যাকে রূপান্তর_ত_ নিনোদব বলা হয়।


1

ওও আমি ঠিক পেয়েছি! এটি ইতিমধ্যে পোস্ট করা প্রচুর উত্তরগুলির একটি মিশ্রণ ছিল (নির্দোষ, স্বাক্ষরযুক্ত, ইত্যাদি)। আমি এখানে যা দেখতে পাইনি তা হ'ল: যদি আপনার এফকে কোনও পিকে নির্দেশ করে থাকে তবে উত্সের কলামটির একটি মান রয়েছে যা নিশ্চিত হয়ে যায় ensure উদাহরণস্বরূপ, পিকে যদি মিডিয়ামিন্ট (8) হয় তবে তা নিশ্চিত করুন যে উত্স কলামে একটি মিডিয়ামিনেট (8) রয়েছে। এটা আমার জন্য সমস্যার অংশ ছিল।


1

আমার জন্য এটি কলামের ধরণ ছিল। BigINT! = INT।

কিন্তু তারপরেও এটি কার্যকর হয়নি।

তাই আমি ইঞ্জিনগুলি পরীক্ষা করেছিলাম। টেবিল 1 = ইনোডিবি এবং টেবিল = ইনোডিবি নিশ্চিত করুন


1

আমি একটি সম্পূর্ণ ভিন্ন কারণে এই ত্রুটিটি অনুভব করেছি। আমি আমার ডেটা মডেল তৈরি করার জন্য মাইএসকিউএল ওয়ার্কবেঞ্চ 6.3 ব্যবহার করেছি (দুর্দান্ত সরঞ্জাম)। আমি লক্ষ্য করেছি যে বিদেশী কী সীমাবদ্ধতার সংজ্ঞায় সংজ্ঞায়িত কলামের আদেশটি সারণী কলামের ক্রমটি ফিট করে না যখন এই ত্রুটিটিও উত্পন্ন হয়।

আমার কাছে প্রায় 4 ঘন্টা বাকি সমস্ত কিছুর চেষ্টা করে যাচাই করে।

এখন সব ঠিকঠাক চলছে এবং আমি কোডিংয়ে ফিরে যেতে পারি। :-)


এর মানে কি বোঝাতে চাচ্ছো?
ইয়াজান জাবের

2
@ ইয়াজানব্যাবার আমার মনে হয় তার অর্থ এই : ইনোডিবি কোনও সূচী কলাম বা কলামের দলকে রেফারেন্স করার জন্য একটি বিদেশী কীকে অনুমতি দেয়। তবে রেফারেন্স সারণীতে অবশ্যই একটি সূচক থাকতে হবে যেখানে রেফারেন্সযুক্ত কলামগুলি একই ক্রমের প্রথম কলাম হিসাবে তালিকাভুক্ত হবে।
রোবস

1

লারাভেল মাইগ্রেশন ব্যবহার করার সময় বিদেশী কী তৈরি করার চেষ্টা করুন

এই উদাহরণটি পছন্দ করুন:

ব্যবহারকারীর টেবিল

    public function up()
{
    Schema::create('flights', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->TinyInteger('color_id')->unsigned();
        $table->foreign('color_id')->references('id')->on('colors');
        $table->timestamps();
    });
}

রঙ টেবিল

    public function up()
{
    Schema::create('flights', function (Blueprint $table) {
        $table->increments('id');
        $table->string('color');
        $table->timestamps();
    });
}

কখনও কখনও সম্পত্তি কাজ করে না

[PDOException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

এই ত্রুটিটি ঘটেছে কারণ [ব্যবহারকারী সারণীতে] বিদেশী কী (প্রকারের) [রঙ সারণীতে] প্রাথমিক কী (প্রকার) থেকে পৃথক

এই সমস্যাটি সমাধান করার জন্য [রঙের টেবিল] এ প্রাথমিক কীটি পরিবর্তন করা উচিত

$table->tinyIncrements('id');


আপনি যখন প্রাথমিক কী ব্যবহার করেন $table->Increments('id');

আপনার Integerএকটি বিদেশী কী হিসাবে ব্যবহার করা উচিত

    $table-> unsignedInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

আপনি যখন প্রাথমিক কী ব্যবহার করেন $table->tinyIncrements('id');

আপনার unsignedTinyIntegerএকটি বিদেশী কী হিসাবে ব্যবহার করা উচিত

    $table-> unsignedTinyInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

আপনি যখন প্রাথমিক কী ব্যবহার করেন $table->smallIncrements('id');

আপনার unsignedSmallIntegerএকটি বিদেশী কী হিসাবে ব্যবহার করা উচিত

    $table-> unsignedSmallInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

আপনি যখন প্রাথমিক কী ব্যবহার করেন $table->mediumIncrements('id');

আপনার unsignedMediumIntegerএকটি বিদেশী কী হিসাবে ব্যবহার করা উচিত

    $table-> unsignedMediumInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

এটি আমাকে সাহায্য করে। আমার কাছে bigIncrementsপ্রাথমিক কী ছিল তাই আমার ব্যবহারের দরকার ছিলunsignedBigInteger
jagad89

1

আমার ক্ষেত্রে FOREIGN KEYউত্স টেবিলের অস্তিত্ব না থাকায় আমাকে চেকগুলি অক্ষম করতে হয়েছিল।

SET FOREIGN_KEY_CHECKS=0;


0

ব্যাককোটিসের ব্যবহার সম্পর্কেও সচেতন হন। আমি একটি স্ক্রিপ্ট নিম্নলিখিত বিবৃতি ছিল

ALTER TABLE service ADD FOREIGN KEY (create_by) REFERENCES `system_user(id)`;

তবে শেষে ব্যাককোটগুলি মিথ্যা ছিল। এটি হওয়া উচিত ছিল:

ALTER TABLE service ADD FOREIGN KEY (create_by) REFERENCES `system_user`(`id`);

মাইএসকিউএল এই ত্রুটির উপর দুর্ভাগ্যজনক কোনও বিবরণ দেয় না ...


0

এই ত্রুটির আর একটি উত্স হ'ল আপনার 2 বা ততোধিক একই টেবিলের নাম রয়েছে যা একই বিদেশী কী নাম রয়েছে। এটি কখনও কখনও মাইএসকিএল ওয়ার্কবেঞ্চের মতো মডেলিং এবং ডিজাইন সফ্টওয়্যার ব্যবহার করে এবং পরে নকশা থেকে স্ক্রিপ্ট তৈরি করে people


0

আমি জানি আমি পার্টিতে খুব দেরি করেছি তবে আমি এটি এখানে রাখতে চাই যাতে এটি তালিকাভুক্ত হয়।

পাশাপাশি ক্ষেত্রগুলি অনুরূপভাবে সংজ্ঞায়িত হয়েছে এবং টেবিলের ধরণগুলিতেও একই সমষ্টি রয়েছে তা নিশ্চিত করার জন্য উপরের সমস্ত পরামর্শের সাথে নিশ্চিত করুন যে CHILD ক্ষেত্রের ডেটা যেখানে নেই সেই ক্ষেত্রগুলিকে সংযোগ স্থাপনের চেষ্টা করার ক্ষেত্রে আপনি যে ভুলভাবে ভুল করছেন না তা নিশ্চিত করুন ইতিমধ্যে প্যারেন্ট ক্ষেত্রের। আপনি যদি ইতিমধ্যে প্যারেন্ট ক্ষেত্রের মধ্যে প্রবেশ করেন নি এমন বাচ্চাদের ক্ষেত্রে এমন ডেটা যদি থাকে তবে তা এই ত্রুটির কারণ হতে পারে। এটি লজ্জার বিষয় যে ত্রুটি বার্তাটি আরও কিছুটা সহায়ক নয়।

আপনি যদি অনিশ্চিত হন তবে তারপরে বিদেশী কী থাকা সারণীতে ব্যাকআপ করুন, সমস্ত ডেটা মুছুন এবং তারপরে বিদেশী কী তৈরির চেষ্টা করুন। সফল হলে আপনি কি করবেন!

শুভকামনা।


0

এটি ইতিমধ্যে যা বলা হয়েছে তার একটি সূক্ষ্ম সংস্করণ, তবে আমার উদাহরণে আমার কাছে 2 টি ডাটাবেস (foo এবং বার) ছিল। আমি প্রথমে foo তৈরি করেছি এবং আমি বুঝতে পারিনি যে এটি বার bazবাজে (যা এখনও তৈরি হয়নি) a যখন আমি বার.বাজ তৈরি করার চেষ্টা করেছি (কোনও বিদেশী কী ছাড়াই), আমি এই ত্রুটিটি পেতে থাকি। কিছুক্ষণ খোঁজ নেওয়ার পরে আমি ফোনে বিদেশী চাবি পেয়েছি।

সুতরাং, দীর্ঘ গল্পের সংক্ষিপ্ত বিবরণ, আপনি যদি এই ত্রুটিটি পান তবে আপনার সারণীতে একটি পূর্ব-বিদ্যমান বিদেশী কী থাকতে পারে।


0

আমার জন্য, 1215 ত্রুটিটি ঘটেছে যখন আমি তৈরি একটি ডাম্পফিল আমদানি করছিলাম mysqldump, যা বর্ণমালা অনুসারে সারণীগুলি তৈরি করে, যা আমার ক্ষেত্রে পরে ফাইলটিতে রেফারেন্স সারণীতে বিদেশী কীগুলি তৈরি করেছিল। (এটি দেখানোর জন্য এই পৃষ্ঠার প্রপস: https://www.percona.com/blog/2017/04/06/dealing-mysql-error-code-1215-cannot-add-foreign-key-constraint/ )

যেহেতু মাইএসকিলডাম টেবিলগুলি বর্ণানুক্রমিকভাবে আদেশ করে এবং আমি টেবিলের নাম পরিবর্তন করতে চাই না, তাই জেরেমিওয়ের দ্বারা উত্তরটিতে থাকা নির্দেশাবলী আমি এই পৃষ্ঠায় অনুসরণ করেছি , যা set FOREIGN_KEY_CHECKS = 0;ডাম্প ফাইলের শীর্ষে রাখে এবং ডাম্প ফাইলের SET FOREIGN_KEY_CHECKS = 1;নীচে রাখে states ।

এই সমাধানটি আমার পক্ষে কাজ করেছিল।


0

সুতরাং আমি উপরের সমস্ত সংশোধনগুলি চেষ্টা করেছিলাম এবং কোনও ভাগ্য নেই। আমি আমার টেবিলগুলিতে ত্রুটিটি মিস করছি - কারণটির সন্ধান করতে না পারায় এবং আমি ত্রুটি পেতে থাকি 1215. সুতরাং আমি এই সংশোধনটি ব্যবহার করেছি।

পিএইচপিএমআইএডমিনে আমার স্থানীয় পরিবেশে, আমি প্রশ্নযুক্ত টেবিল থেকে ডেটা রফতানি করেছি। আমি সিএসভি ফর্ম্যাট নির্বাচন করেছি। নির্বাচিত টেবিলটি এখনও phpMyAdmin এ থাকাকালীন আমি "আরও-> বিকল্পগুলি" নির্বাচন করেছি। এখানে আমি "অনুলিপি টেবিল টু (ডাটাবেস.টিটেবল) - এ গিয়ে স্ক্রোল করেছি" কেবলমাত্র কাঠামোটি নির্বাচন করুন table টেবিলটির নতুন কিছু নাম দিন, সম্ভবত কেবলমাত্র বর্তমান টেবিলের নামের পাশে "অনুলিপি" শব্দটি যুক্ত করুন Go "যান" ক্লিক করুন এটি একটি নতুন তৈরি করবে টেবিল। নতুন টেবিলটি রফতানি করুন এবং নতুন বা অন্য সার্ভারে এটি আমদানি করুন I আমি এখানে phpMyAdminও ব্যবহার করছি Once একবার আমদানি করা হলে টেবিলের নামটি তার মূল নামে ফিরে আসুন new নতুন টেবিলটি নির্বাচন করুন, আমদানি নির্বাচন করুন। ফর্ম্যাটের জন্য সিএসভি নির্বাচন করুন । "বিদেশী কী পরীক্ষাগুলি সক্ষম করুন" আনচেক করুন "" যান "নির্বাচন করুন far এখন পর্যন্ত সমস্ত কিছুই ভাল কাজ করছে।

আমি আমার ব্লগে আমার ফিক্স পোস্ট করেছি ।


-1

এমনকি আমারও একই সমস্যা ছিল। এবং দোষ ছিল এফকে টেবিলের পিকে-তে "স্বাক্ষরবিহীন" চিহ্নিতকারীটির


-6

আমি একবার একই ত্রুটি ছিল। আমি কেবল মাইএসকিউএল সার্ভারটি পুনরায় শুরু করেছি এবং সমস্যাটি ঠিক করেছি।


এটি মোটেও সমস্যার সমাধান করে না।
জেমস 111
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.