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




(9)

যখন করছেন:

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

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

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

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

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


আপনি ক্রম অনুসারে এটি মুছে ফেলতে হবে টেবিলে নির্ভরতা আছে


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

FOREIGN_KEY_CHECKS

যাতে ডাটা অখণ্ডতা নিষ্ক্রিয় করা যেতে পারে:

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

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

2) আপনার মুছে ফেলার অপারেশন thruogh sql বা api সক্রিয় করুন

3) স্কিম ফিরে বিদেশী কী যোগ করুন

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

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


আপনি যদি একটি টেবিল ড্রপ করতে চান তবে আপনাকে নিচের ক্যোয়ারিকে একক পদক্ষেপে চালানো উচিত

SET FOREIGN_KEY_CHECKS = 0; ড্রপ টেবিল টেবিল_নাম;


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

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

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

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

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


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

    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 ;

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

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

একবার আপনি বিদেশী কী সম্পর্ক সংশোধন করলে আপনার মুছে ফেলা বিবৃতিটি কাজ করবে।


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





sql