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


170

যখন করছেন:

DELETE FROM `jobs` WHERE `job_id` =1 LIMIT 1 

এটি ত্রুটি:

#1451 - Cannot delete or update a parent row: a foreign key constraint fails 
(paymesomething.advertisers, CONSTRAINT advertisers_ibfk_1 FOREIGN KEY 
(advertiser_id) REFERENCES jobs (advertiser_id))

এখানে আমার টেবিলগুলি রয়েছে:

CREATE TABLE IF NOT EXISTS `advertisers` (
  `advertiser_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `password` char(32) NOT NULL,
  `email` varchar(128) NOT NULL,
  `address` varchar(255) NOT NULL,
  `phone` varchar(255) NOT NULL,
  `fax` varchar(255) NOT NULL,
  `session_token` char(30) NOT NULL,
  PRIMARY KEY (`advertiser_id`),
  UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;


INSERT INTO `advertisers` (`advertiser_id`, `name`, `password`, `email`, `address`, `phone`, `fax`, `session_token`) VALUES
(1, 'TEST COMPANY', '', '', '', '', '', '');

CREATE TABLE IF NOT EXISTS `jobs` (
  `job_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `advertiser_id` int(11) unsigned NOT NULL,
  `name` varchar(255) NOT NULL,
  `shortdesc` varchar(255) NOT NULL,
  `longdesc` text NOT NULL,
  `address` varchar(255) NOT NULL,
  `time_added` int(11) NOT NULL,
  `active` tinyint(1) NOT NULL,
  `moderated` tinyint(1) NOT NULL,
  PRIMARY KEY (`job_id`),
  KEY `advertiser_id` (`advertiser_id`,`active`,`moderated`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;


INSERT INTO `jobs` (`job_id`, `advertiser_id`, `name`, `shortdesc`, `longdesc`, `address`, `active`, `moderated`) VALUES
(1, 1, 'TEST', 'TESTTEST', 'TESTTESTES', '', 0, 0);

ALTER TABLE `advertisers`
  ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`) REFERENCES `jobs` (`advertiser_id`);

উত্তর:


108

যেমনটি হ'ল, বিজ্ঞাপনের টেবিলের বাইরে সারিটি মুছে ফেলতে হবে তার আগে উল্লেখ করা জব সারণীতে সারিটি মুছে ফেলার আগে। এই:

ALTER TABLE `advertisers`
  ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`) 
      REFERENCES `jobs` (`advertiser_id`);

... আসলে যা হওয়া উচিত তার বিপরীতে। যেমনটি হয়, এর অর্থ হ'ল বিজ্ঞাপনদাতাদের সামনে আপনার কাজের টেবিলে একটি রেকর্ড থাকতে হবে। সুতরাং আপনার ব্যবহার করা দরকার:

ALTER TABLE `jobs`
  ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`) 
      REFERENCES `advertisers` (`advertiser_id`);

আপনি একবার বিদেশী কী সম্পর্কটি সংশোধন করলে আপনার মোছার বিবৃতি কার্যকর হবে will


3
প্রথম লাইনে: আপনি কি মনে করেন না যে এটি "এটি উল্লেখ করে" এর পরিবর্তে "এটি উল্লেখ করা উচিত"? বা রেফারেন্স পরিভাষাটি কীভাবে কাজ করার কথা বলে আমি ভুল বুঝেছি?
আব্রাহাম ফিলিপ

6
@ আব্রাহাম ফিলিপ আমিও একই কথা ভাবছিলাম। বিজ্ঞাপনদাতারা কাজের উল্লেখ।
কীজার

270

সহজ উপায় হ'ল বিদেশী কী চেকটি অক্ষম করা; পরিবর্তনগুলি করুন এবং বিদেশী কী চেকটি পুনরায় সক্ষম করুন।

SET FOREIGN_KEY_CHECKS=0; -- to disable them
SET FOREIGN_KEY_CHECKS=1; -- to re-enable them

171
এটি সমস্যার সমাধান নয়, বরং একটি নোংরা কাজ যা আপনার পছন্দসই নয়।
পাগল বন্ধু 15

20
আমার ক্ষেত্রে: আমি কেবল একটি বড় এসকিউএল ফাইল চালিয়েছি এবং চূড়ান্ত বিবৃতিগুলির মধ্যে একটি ব্যর্থ হয়েছে, তাই আমি কেবল সমস্ত টেবিলগুলি মুছতে চাইব, সিনট্যাক্স ত্রুটিটি ঠিক করব এবং পুনরায় চালু করতে চাই, যা ঠিক আমি খুঁজছিলাম তা তৈরি করে।
এরকার 13

1
আপনি যদি এটি করতে যাচ্ছেন তবে কেন কেবল সমস্ত বাধা সরিয়ে ফেলবেন না?
সাবেলফোস্টে

1
এর মতো কিছু করার সময় এটি দরকারী:REPLACE INTO tab_with_constraint ...
ম্যাকিক Łoziński

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

38

আপনার বর্তমান (সম্ভবত ত্রুটিযুক্ত) ডিজাইনের অধীনে, বিজ্ঞাপনের সারণির বাইরে সারিটি মুছে ফেলার আগে অবশ্যই তার সুনির্দিষ্ট কাজ সারণীতে মুছে ফেলতে হবে it

বিকল্পভাবে, আপনি আপনার বিদেশী কী সেট আপ করতে পারেন যে প্যারেন্ট সারণিতে মোছার ফলে শিশু টেবিলগুলিতে সারিগুলি স্বয়ংক্রিয়ভাবে মোছা হতে পারে। একে ক্যাসকেডিং মুছা বলা হয়। এটি দেখতে এমন কিছু দেখাচ্ছে:

ALTER TABLE `advertisers`
ADD CONSTRAINT `advertisers_ibfk_1`
FOREIGN KEY (`advertiser_id`) REFERENCES `jobs` (`advertiser_id`)
ON DELETE CASCADE;

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

ALTER TABLE `jobs`
ADD FOREIGN KEY (`advertiser_id`) REFERENCES `advertisers` (`advertiser_id`);

এবং ক্যাসকেডিং মোছার প্রয়োজন হবে না।


18

আপনি যদি কোনও টেবিলটি ফেলে দিতে চান তবে আপনার একক পদক্ষেপে নিম্নলিখিত কোয়েরি সম্পাদন করা উচিত

বিদেশে সেট করুন_কিজি_চেক = 0; টেবিলের টেবিলের নাম ড্রপ করুন;


13

আমি @ অ্যালিনো মনজি দ্বারা উল্লিখিত সমাধানটি চেষ্টা করেছিলাম তবে ডাব্লুপিডিবি ব্যবহার করে ওয়ার্ডপ্রেস সম্পর্কিত টেবিলগুলিতে এটি আমার পক্ষে কার্যকর হয়নি।

তারপরে আমি নীচের মত কোডটি পরিবর্তন করেছি এবং এটি কার্যকর হয়েছে

SET FOREIGN_KEY_CHECKS=OFF; //disabling foreign key

//run the queries which are giving foreign key errors

SET FOREIGN_KEY_CHECKS=ON; // enabling foreign key

6

আমি মনে করি আপনার বিদেশী চাবি পিছনের দিকে। চেষ্টা করুন:

ALTER TABLE 'jobs'
ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`) REFERENCES `advertisers` (`advertiser_id`)

5

যদি একই বিজ্ঞাপনদাতা_আইডির একাধিক কাজ থাকে তবে আপনার বিদেশী কী হওয়া উচিত:

ALTER TABLE `jobs`
ADD CONSTRAINT `advertisers_ibfk_1` 
FOREIGN KEY (`advertiser_id`) 
REFERENCES `advertisers` (`advertiser_id`);

অন্যথায় (যদি এটি আপনার ক্ষেত্রে অন্যভাবে হয়), আপনি যদি চান বিজ্ঞাপনদাতাদের সারিগুলি স্বয়ংক্রিয়ভাবে মুছে ফেলা হয় তবে যদি কাজের সারিটি মুছে ফেলা হয় তবে আপনার বিদেশী কীটির শেষে 'অপসারণ ক্যাসকেড' বিকল্পটি যুক্ত করুন:

ALTER TABLE `advertisers`
ADD CONSTRAINT `advertisers_ibfk_1` 
FOREIGN KEY (`advertiser_id`) 
REFERENCES `jobs` (`advertiser_id`)
ON DELETE CASCADE;

পরীক্ষা করে দেখুন পররাষ্ট্র কী সীমাবদ্ধতা



2

আপনি যখন ডাটাবেস তৈরি করেন বা টেবিল তৈরি করেন

আপনার উপরের স্ক্রিপ্টে লাইনটি ডাটাবেস বা সারণী তৈরি করা উচিত

SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=1;

এখন আপনি টেবিল থেকে রেকর্ড মুছতে চান? তাহলে আপনি লিখুন

SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=1;
DELETE FROM `jobs` WHERE `job_id` =1 LIMIT 1

শুভকামনা!


2

এই বিকল্পটি আমি কীভাবে ব্যবহার করছি: বিদেশী কীটি নুল হতে দিন এবং তারপরে সেটটি বাতিল করুন নির্বাচন করুন ।

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

আশাকরি এটা সাহায্য করবে.


2

লারভেল মাইগ্রেশনে আমার এই সমস্যা ছিল খুব
ডাউন () পদ্ধতিতে ড্রপ টেবিলের ক্রমটিও গুরুত্বপূর্ণ

Schema::dropIfExists('groups');
Schema::dropIfExists('contact');

কাজ নাও করতে পারে তবে আপনি যদি অর্ডার পরিবর্তন করেন তবে এটি কাজ করে।

Schema::dropIfExists('contact');
Schema::dropIfExists('groups');

1

আপনার যদি ক্লায়েন্টকে যত তাড়াতাড়ি সম্ভব সমর্থন করা প্রয়োজন, এবং এতে অ্যাক্সেস নেই

FOREIGN_KEY_CHECKS

যাতে ডেটা অখণ্ডতা অক্ষম করা যায়:

1) বিদেশী কী মুছুন

ALTER TABLE `advertisers` 
DROP FOREIGN KEY `advertisers_ibfk_1`;

2) স্কিল বা এপিআই মাধ্যমে আপনার মোছা অপারেশন সক্রিয় করুন

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

ALTER TABLE `advertisers`
  ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`) REFERENCES `jobs` (`advertiser_id`);

তবে এটি একটি হট-ফিক্স, সুতরাং এটি আপনার নিজের ঝুঁকির উপর, কারণ এই জাতীয় পদ্ধতির মূল ত্রুটি হ'ল ম্যানুয়ালি ডেটা অখণ্ডতা বজায় রাখার জন্য এটি পরে প্রয়োজন।


0

কাজ মুছে ফেলার আগে আপনি রেফারেন্সযুক্ত সারিগুলি মুছতে একটি ট্রিগার তৈরি করতে পারেন।

    DELIMITER $$
    CREATE TRIGGER before_jobs_delete 
        BEFORE DELETE ON jobs
        FOR EACH ROW 
    BEGIN
        delete from advertisers where advertiser_id=OLD.advertiser_id;
    END$$
    DELIMITER ;

0

এই ইরটারটির প্রধান সমস্যাটি হ'ল Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint failsএটি আপনাকে জানাতে দেয় না যে কোন সারণিতে এফকে ব্যর্থতা রয়েছে , তাই বিরোধটি সমাধান করা কঠিন difficult

আপনি যদি মাইএসকিউএল বা অনুরূপ ব্যবহার করেন তবে আমি জানতে পেরেছিলাম যে আপনি আপনার ডাটাবেসের জন্য একটি ইআর ডায়াগ্রাম তৈরি করতে পারেন , তারপরে আপনি ত্রুটিটি ট্রিগারকারী কোনও বিবাদ পর্যালোচনা করে নিরাপদে মুছে ফেলতে পারবেন।

  1. মাইএসকিউএল ওয়ার্কবেঞ্চ ব্যবহার করুন
  2. ডাটাবেস -> বিপরীত প্রকৌশল ক্লিক করুন
  3. একটি সঠিক নির্বাচন করুন connection
  4. শেষ অবধি পরবর্তী, নির্বাচন করতে ভুলবেন না databaseএবং tablesএটি পরীক্ষা করা প্রয়োজন
  5. এখন আপনার কাছে ER ডায়াগ্রাম রয়েছে, আপনি দেখতে পাচ্ছেন কোন টেবিলের এফকে বিরোধ রয়েছে

0

মূলত, এই ধরণের ত্রুটির কারণ হ'ল অবশেষে আপনি এমন একটি টিপল মুছতে চেষ্টা করছেন যাতে প্রাথমিক কী (মূল টেবিল) রয়েছে এবং সেই প্রাথমিক কীটি বিদেশী কী হিসাবে শিশু টেবিলে ব্যবহৃত হয়। এই দৃশ্যে পিতামাতার টেবিল ডেটা মুছতে আপনার চাইল্ড টেবিল ডেটা (যাতে বিদেশী কী ব্যবহার করা হয়) সরাতে হবে। ধন্যবাদ


0

এটি আমার ক্ষেত্রেও হয়েছিল এবং অন্যান্য টেবিলগুলির উপর নির্ভরতা এবং রেফারেন্সের কারণে আমি প্রবেশটি সরাতে পারিনি। আমি যা করেছি তা টেবিলে একটি মুছুন কলাম (টাইপ বুলিয়ান) যুক্ত করা হয়েছে। এই ক্ষেত্রের মানটি আইটেমটি মোছার জন্য চিহ্নিত হয়েছে কিনা তা দেখিয়েছে। যদি মুছে ফেলার জন্য চিহ্নিত করা হয় তবে আনুন / ব্যবহার করবেন না; অন্যথায়, এটি ব্যবহার করুন।


-1

হতে পারে আপনার ক্যাসকেড মুছে ফেলার চেষ্টা করা উচিত


34
সমস্যাটি না বুঝে অন্ধভাবে একটি ক্যাসকেডিং মুছা (যা ডেটা নষ্ট করে দেবে) যোগ করা কেবলমাত্র সবচেয়ে খারাপ কাজটিই করতে পারে one
টম এইচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.