বোগাস বিদেশী কী বাধা ব্যর্থ


110

আমি এই ত্রুটি বার্তাটি পেয়েছি:

40 লাইনে 1212 (23000) এর ত্রুটি: পিতামাতার সারিটি মুছতে বা আপডেট করতে পারে না: একটি বিদেশী কী বাধা ব্যর্থ হয়

... যখন আমি একটি টেবিল ফেলে দেওয়ার চেষ্টা করি:

DROP TABLE IF EXISTS `area`;

... এটির মতো সংজ্ঞায়িত:

CREATE TABLE `area` (
  `area_id` char(3) COLLATE utf8_spanish_ci NOT NULL,
  `nombre_area` varchar(30) COLLATE utf8_spanish_ci NOT NULL,
  `descripcion_area` varchar(100) COLLATE utf8_spanish_ci NOT NULL,
  PRIMARY KEY (`area_id`),
  UNIQUE KEY `nombre_area_UNIQUE` (`nombre_area`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;

মজার বিষয় হ'ল আমি ইতিমধ্যে স্কিমায় অন্যান্য সমস্ত টেবিলগুলি বাদ দিয়েছি যার বিরুদ্ধে বিদেশী কী রয়েছে area। আসলে, areaটেবিল ব্যতীত ডাটাবেস খালি রয়েছে।

ডাটাবেসে অন্য কোনও অবজেক্ট না থাকলে এটি কীভাবে সন্তানের সারি থাকতে পারে? আমি যতদূর জানি, ইনোডিবি অন্যান্য স্কিমায় বিদেশী কীগুলিকে অনুমতি দেয় না, তাই না?

(আমি এমনকি একটি RENAME TABLE area TO something_elseকমান্ড চালাতে পারি : -?)


এটা কি সম্ভব যে টেবিলটি অন্য স্কিমাতে একটি রেফারেন্সিয়াল-ইন্টিগ্রিটির সম্পর্কের অংশ?
রাজ মোর

আমার কাছে অ্যাপটির আরও কিছু কপি রয়েছে যাতে এটি সর্বদা সম্ভব। তবে আমি যে সিনট্যাক্সটি ব্যবহার করি তা মূলত CONSTRAINT fk_servicio_area1 FOREIGN KEY (area_id) REFERENCES area (area_id), অর্থাত্, টেবিলের রেফারেন্সে কোনও স্কিমার নাম নেই: -?
vlvaro González

উত্তর:


101

দুটি সম্ভাবনা:

  1. অন্য স্কীমার মধ্যে একটি টেবিল রয়েছে (মাইএসকিএল পরিভাষায় "ডাটাবেস") যার এফকে রেফারেন্স রয়েছে
  2. ইনসোডব অভ্যন্তরীণ ডেটা অভিধানটি মাইএসকিএল এর সাথে সিঙ্কের বাইরে।

ড্রপ ব্যর্থ হওয়ার পরে "শো ইঞ্জিন ইননোডব স্ট্যাটাস" করে আপনি এটি দেখতে পারেন যে এটি কোনও টেবিলটি ছিল (সেগুলির মধ্যে একটিরও হোক)।

যদি এটি পরবর্তীতে দেখা যায় তবে আপনি যদি পারেন তবে আমি পুরো সার্ভারটি ডাম্প করে পুনরুদ্ধার করব।

মাইএসকিউএল 5.1 এবং উপরেরটি আপনাকে ত্রুটির বার্তায় এফকে দিয়ে সারণির নাম দেবে।


1
আমি আর এই সমস্যাটি পুনরুত্পাদন করতে পারি না। সিঙ্ক অভিধানের বাইরে থাকা সম্ভবত একটি কারণ হিসাবে দাঁড়িয়েছে। আমি এটি পরীক্ষা করে দেখব এবং কি SHOW ENGINE INNODB STATUSরিপোর্ট করছে।
vলভারো গঞ্জালেজ

3
এই উত্তরের জন্য আপনাকে ধন্যবাদ! আমার কাছে একটি টু-টু টেবিল ছিল এখনও টেবিলের উল্লেখ করে আমরা ফেলে দিতে পারি না, তাই আমাকে প্রথমে সেই টেবিলটি ফেলে দিতে হয়েছিল।
ক্রিশ্চিয়ান ওডার্ড

5
ইঞ্জিন ইননোডবি পরিস্থিতি "সর্বশেষ বিদেশী কী ত্রুটি" এর অধীনে সর্বশেষ বিদেশী কী ত্রুটিটি তালিকাভুক্ত করে। এটি একটি টাইমস্ট্যাম্প আছে।
bbrame

সাবজেক্ট টেবিলে একটি রেফারেন্স কী থাকা এখনও একটি টেবিল থাকতে পারে। এটা আমার ক্ষেত্রে ছিল, এই মত।
আরটি

অনেক সময় বাঁচিয়েছে। "সর্বশেষ বিদেশী কী ত্রুটি" এর অধীনে
ডিবিটি ফেলে দেওয়া হয়েছে

121

চাহিদা অনুযায়ী, এখন উত্তর হিসাবে ...

মাইএসকিউএল ক্যোয়ারী ব্রাউজার বা পিএইচপিএমআইএডমিন ব্যবহার করার সময়, এটি উপস্থিত হয় যে প্রতিটি ক্যোয়ারির জন্য একটি নতুন সংযোগ খোলা হয়েছে ( bugs.mysql.com/bug.php?id=8280 ), এটি একটি কোয়েরিতে সমস্ত ড্রপ স্টেটমেন্ট লিখতে প্রয়োজনীয় করে তোলে, যেমন।

SET FOREIGN_KEY_CHECKS=0; 
DROP TABLE my_first_table_to_drop; 
DROP TABLE my_second_table_to_drop; 
SET FOREIGN_KEY_CHECKS=1; 

যেখানে SET FOREIGN_KEY_CHECKS=1অতিরিক্ত সুরক্ষা ব্যবস্থা হিসাবে পরিবেশন করা হয়েছে ...


2
পিএইচপিএমআইএডমিন ব্যবহার করে যারা ডাম্প তৈরি করছেন তাদের জন্য একটি বিকল্প আছে "বিদেশী কী চেকগুলি অক্ষম করুন" যা স্বয়ংক্রিয়ভাবে SET FOREIGN_KEY_CHECKS=0;ডাম্পের শুরুতে যুক্ত করবে ।
মাইক 18

দেখে মনে হচ্ছে পিএইচপিএমএইডমিন এই সুন্দর বৈশিষ্ট্যটি বাস্তবায়িত করেছে, এখন আমি মাইএসকিএলওর্কব্যাঞ্চ একই কাজ করার জন্য অপেক্ষা করছি! :)
কার্লিস রোড

@ কোডেমেড এফওয়াইআই, আমি মার্কআরের জবাবটি গ্রহণ করেছি কারণ এটি ইস্যুটি বোঝার জন্য একটি ব্যাখ্যা প্রদান করে - যদিও আমি স্বীকার করি যে আমি পরের 6 বছরে এই একই সমস্যার মুখোমুখি হইনি, আমি এটি যাচাই করতে পারিনি, একবারও নয়। এটি এবং পূর্ববর্তী উত্তরগুলি একটি কার্যকরী বিষয় সরবরাহ করে (সেই ভালটির জন্য দুর্দান্ত) তবে সত্যই নিজের প্রশ্নের উত্তর দেয় না এবং যেহেতু আপনি কেবলমাত্র আমার উত্তর বেছে নিতে পারেন তার একটি উত্তর আপনি গ্রহণ করতে পারেন।
আলভারো গঞ্জালেজ

1
সতর্কতা: এটি কোনও সমাধান নয় তবে কেবল অলস লোকের কর্মসংস্থান। এই ব্যবহার করে (বাদ টেবিলে ইশারা কিছু অন্যান্য টেবিলের উপর রেকর্ডের সঙ্গে) করার পরে, আপনি বিদেশী কী যা মারাত্মক ভাবে দৃঢ়তা (বিরতি আনত অভিজ্ঞতা হবে সি মধ্যে ACID আপনার ডাটাবেস এর) এবং আপনার অ্যাপ্লিকেশন সব জায়গায় বেশি ব্যতিক্রম নিক্ষেপ শুরু হবে। আপনাকে সতর্ক করা হয়েছে।
বেকস

যদিও আমি নিশ্চিত যে বেকসের সতর্কতাটি বোঝা উচিত এবং তার প্রতি যত্নবান হওয়া উচিত, এই সমাধানটি আমার পক্ষে কার্যকর হয়েছিল, এমন পরিস্থিতিতে যেখানে আমি আত্মবিশ্বাসী ছিলাম যে সমস্ত টেবিলগুলি আমি ঝামেলাযুক্ত বিদেশী কী সীমাবদ্ধতার সাথে টেবিলগুলিতে ইশারা করছিলাম সেগুলিও আমি বাদ দিচ্ছি।
ব্যবহারকারী 1147171

47

বিদেশী কী চেক করা অক্ষম করুন

SET FOREIGN_KEY_CHECKS=0

62
সঠিক কমান্ডটি উপস্থিত হবে SET FOREIGN_KEY_CHECKS=0এবং এটি ত্রুটির বার্তাটি ঠিক করে। কেন এটি প্রয়োজন তা সম্পর্কে আপনার কোনও ধারণা আছে? টেবিলগুলি চলে যাওয়ার পরেও কি বিদেশী কীগুলি ক্যাশে করা হয়?
vlvaro González

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

55
SET FOREIGN_KEY_CHECKS=1;আপনার কাজ শেষ হওয়ার পরে নিশ্চিত করুন !
পেড্রো_স্ল্যান্ড

5
মাইএসকিউএল ক্যোয়ারী ব্রাউজার বা পিএইচপিএমআইএডমিন ব্যবহার করার সময়, এটি উপস্থিত হয় যে প্রতিটি ক্যোয়ারির জন্য একটি নতুন সংযোগ খোলা হয়েছে ( bugs.mysql.com/bug.php?id=8280 ), এটি একটি কোয়েরিতে সমস্ত ড্রপ স্টেটমেন্ট লিখতে প্রয়োজনীয় করে তোলে, যেমন। SET FOREIGN_KEY_CHECKS=0; DROP TABLE my_first_table_to_drop; DROP TABLE my_second_table_to_drop; SET FOREIGN_KEY_CHECKS=1; যেখানে SET FOREIGN_KEY_CHECKS = 1 অতিরিক্ত সুরক্ষা ব্যবস্থা হিসাবে পরিবেশন করে ...
কার্লিস রোড

1
পিএইচপিএমআইএডমিনের মন্তব্যের জন্য @ কার্লিসরোড, ব্র্যাভো। যদি আপনি এটির উত্তর হিসাবে রাখেন তবে আমি এটি +1 করতাম।
সাবলফস্টে

28

এই ব্লগ থেকে :

আপনি অস্থায়ীভাবে বিদেশী কী চেকগুলি অক্ষম করতে পারেন:

SET FOREIGN_KEY_CHECKS=0;

আপনার চারপাশে জগাখিচু হয়ে যাওয়ার পরে সেগুলি পুনরুদ্ধার করার বিষয়ে নিশ্চিত হন:

SET FOREIGN_KEY_CHECKS=1;

স্থানীয়ভাবে বিকাশ করার সময় চমৎকার উত্তর :)
অ্যাডেলিন

এটি একটি বৈধ workaround (আমি এটি কাজ করে তা নিশ্চিত করতে পারি) তবে লিঙ্কযুক্ত ব্লগ এন্ট্রি এই প্রশ্নের দৃশ্যের বিষয়ে সত্যই কথা বলে না (একটি টেবিলের জন্য ইতিমধ্যে খালি সংরক্ষণ করা ডেটাবেস)।
আলভারো গঞ্জালেজ

6

আশা করি এর কাজ

SET বিদেশী_কি_চেকস = 0; টেবিল ড্রপ table name; SET বিদেশী_কি_চেকস = 1;


হ্যাঁ, এটি কাজ করে, যেমন এর আগে বারবার উল্লেখ করা হয়েছে ;-)
এলভারো গঞ্জালেজ

1

কারাগারে, নিম্নলিখিতগুলি ব্যবহার করে কেউ করতে পারেন rails console:

connection = ActiveRecord::Base.connection
connection.execute("SET FOREIGN_KEY_CHECKS=0;")

0

এই টেবিলটির সাথে কাজ করার আগে আপনি একটি ত্রুটি পেয়েছিলেন। আপনি টেবিলটির নাম পরিবর্তন করতে পারেন এবং এটি আবার মুছে ফেলার চেষ্টা করতে পারেন।

ALTER TABLE `area` RENAME TO `area2`;
DROP TABLE IF EXISTS `area2`;

0

আমি একটি সহজ সমাধান খুঁজে পেয়েছি, ডাটাবেস রফতানি করেছি, আপনি কোনও পাঠ্য সম্পাদক এ সম্পাদনা করতে চান তা সম্পাদনা করুন, তারপরে এটি আমদানি করুন। সম্পন্ন


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

1
আপনি আসলে কি বুঝতে পারছি না ডাটাবেস ডাম্পিং, CREATE TABLEকোড সরিয়ে আবার ডাম্প লোড করা ... মাইএসকিউএল টেবিলটি সরাবে না। এবং আপনি যদি নতুন ডেটাবেজে ডাম্প পুনরুদ্ধার করতে চান ... আপনি যদি আমার মতো সমস্ত টেবিল মুছতে চান তবে একটি নতুন তৈরি ডাটাবেস ইতিমধ্যে খালি থাকবে be আপনি যদি কিছু টেবিল রাখতে চান তবে SET FOREIGN_KEY_CHECKS=0এখানে সর্বত্র উল্লিখিত কার্যকারিতা সূক্ষ্মভাবে কাজ করে এবং এটি সহজ; এবং আপনার সম্ভবত ডাম্পটি সম্পাদনা করার দরকার নেই যেহেতু আপনার ডেটার নতুন অনুলিপিতে সম্ভবত কোনও সিঙ্কের বাইরে থাকা ডেটা অভিধান নেই dictionary
এলভারো গঞ্জালেজ

-1

পিতামাতার সারিটি মুছতে বা আপডেট করতে পারে না: একটি বিদেশী কী সীমাবদ্ধতা ব্যর্থ হয় ( table1user_role, FK143BF46A8dsfsfds@#5A6BD60বিদেশী কী (চুক্তি নিয়ন্ত্রণ user_id) user( id) উল্লেখ ( ))

আমি দুটি সহজ পদক্ষেপে কি করেছি। প্রথমে আমি চাইল্ড টেবিলের মতো চাইল্ড সারিটি মুছুন

mysql> টেবিল 2 থেকে মুছুন যেখানে ভূমিকা_id = 2 && ব্যবহারকারী_আইডি = 20;

অনুসন্ধান ঠিক আছে, 1 টি সারি প্রভাবিত (0.10 সেকেন্ড)

এবং পিতামাতার মুছে ফেলা হিসাবে দ্বিতীয় পদক্ষেপ

টেবিল 1 থেকে মুছুন যেখানে আইডি = 20;

অনুসন্ধান ঠিক আছে, 1 টি সারি প্রভাবিত (0.12 সেকেন্ড)

এটির মাধ্যমে আমি সমস্যার সমাধান করি যার অর্থ চাইল্ড মুছুন তারপরে পিতামাতার মুছুন

আমি আশা করি আপনি এটি পেয়েছেন। :)


প্রশ্নটি আবার পড়ুন। আপনি কোনও টেবিল অপসারণ করতে পারবেন না যা বিদ্যমান নেই।
vlvaro González

এই দৃশ্যে আমরা বিদেশী কী বাধা মুছে ফেলতে পারি তারপরে সারণীটি মোছার চেষ্টা করব। আমরা এই বিকল্প টেবিলে <TABLE_NAME> ড্রপ চুক্তি <FOREIGN_KEY_NAME>
আদিল মাসাবির
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.