মাইএসকিউএল কোনও বিদেশী কী সীমাবদ্ধতায় সূচকটি ফেলে দিতে পারে না


155

কলাম যুক্ত করতে আমার আমার বিদ্যমান ডাটাবেসটি পরিবর্তন করতে হবে। ফলস্বরূপ আমি নতুন কলামটি আবদ্ধ করতে ইউনিক ফিল্ডটি আপডেট করতে চাই। আমি বর্তমান সূচকটি সরিয়ে দেওয়ার চেষ্টা করছি তবে ত্রুটিটি পেতে থাকিMySQL Cannot drop index needed in a foreign key constraint

CREATE TABLE mytable_a (
ID          TINYINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name        VARCHAR(255) NOT NULL,
UNIQUE(Name)
) ENGINE=InnoDB;

CREATE TABLE mytable_b (
ID          TINYINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name        VARCHAR(255) NOT NULL,
UNIQUE(Name)
) ENGINE=InnoDB;

CREATE TABLE mytable_c (
ID          TINYINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name        VARCHAR(255) NOT NULL,
UNIQUE(Name)
) ENGINE=InnoDB;


CREATE TABLE `mytable` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `AID` tinyint(5) NOT NULL,
  `BID` tinyint(5) NOT NULL,
  `CID` tinyint(5) NOT NULL,
  PRIMARY KEY (`ID`),
  UNIQUE KEY `AID` (`AID`,`BID`,`CID`),
  KEY `BID` (`BID`),
  KEY `CID` (`CID`),
  CONSTRAINT `mytable_ibfk_1` FOREIGN KEY (`AID`) REFERENCES `mytable_a` (`ID`) ON DELETE CASCADE,
  CONSTRAINT `mytable_ibfk_2` FOREIGN KEY (`BID`) REFERENCES `mytable_b` (`ID`) ON DELETE CASCADE,
  CONSTRAINT `mytable_ibfk_3` FOREIGN KEY (`CID`) REFERENCES `mytable_c` (`ID`) ON DELETE CASCADE
) ENGINE=InnoDB;




mysql> ALTER TABLE mytable DROP INDEX AID;
ERROR 1553 (HY000): Cannot drop index 'AID': needed in a foreign key constraint

UNIQUE KEY AIDমাইটিবেল ধরে নিচ্ছেন?
মাইক পার্সেল

উত্তর:


228

আপনাকে বিদেশী কীটি ফেলে দিতে হবে। মাইএসকিউএল-এ বিদেশী কীগুলি স্বয়ংক্রিয়ভাবে টেবিলে একটি সূচক তৈরি করে ( বিষয়টিতে একটি এসও প্রশ্ন ছিল )।

ALTER TABLE mytable DROP FOREIGN KEY mytable_ibfk_1 ; 

12
আপনি সূচকটি ফেলে দেওয়ার পরে এটিকে আবার যুক্ত করতে চাইবেন: mytableস্থানীয় মুছে ফেলা ক্যাসিকেডে mytable_ibfk_1বিদেশী কী ( AID) রেফারেন্স mytable_a( ID) উল্লেখ করুন;
লাফস্টে

8
এটি দুর্দান্ত, তবে আমার FOREIGN KEYসীমাবদ্ধতা বেনামে থাকলে আমি কী করতে পারি ?
পেহাত

@Pehat নীচের আমার উত্তর চেক stackoverflow.com/a/54145440/2305119
thyzz

1
দ্রষ্টব্য: বিদেশী কী সম্ভবত এটি সুস্পষ্ট নাও হতে পারে। কোনও টেবিল এবং কলামের সাথে সম্পর্কিত সমস্ত বিদেশী কীগুলি সন্ধান করতে আপনি এই ক্যোয়ারীটি ব্যবহার করতে পারেন: dba.stackexchange.com/questions/102371/…
চার্ল্যাক্স

84

ধাপ 1

বিদেশী কী তালিকাবদ্ধ করুন (দ্রষ্টব্য যে এটি সূচকের নাম থেকে পৃথক)

SHOW CREATE TABLE  <Table Name>

ফলাফল আপনাকে বিদেশী কী নামটি দেখাবে।

বিন্যাস:

CONSTRAINT `FOREIGN_KEY_NAME` FOREIGN KEY (`FOREIGN_KEY_COLUMN`) REFERENCES `FOREIGN_KEY_TABLE` (`id`),

ধাপ ২

ড্রপ (বিদেশী / প্রাথমিক / কী) কী

ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign key name>

ধাপ 3

সূচকটি ফেলে দিন।


18

যদি আপনি বোঝাতে চান যে আপনি এটি করতে পারেন:

CREATE TABLE mytable_d (
ID          TINYINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name        VARCHAR(255) NOT NULL,
UNIQUE(Name)
) ENGINE=InnoDB;


ALTER TABLE mytable
ADD COLUMN DID tinyint(5) NOT NULL,
ADD CONSTRAINT mytable_ibfk_4 
      FOREIGN KEY (DID) 
        REFERENCES mytable_d (ID) ON DELETE CASCADE;

 > OK.

কিন্তু তারপর:

ALTER TABLE mytable
DROP KEY AID ;

ত্রুটি দেয়


আপনি সূচকটি ফেলে দিতে এবং একটি ALTER TABLEবিবৃতিতে একটি নতুন তৈরি করতে পারেন :

ALTER TABLE mytable
DROP KEY AID ,
ADD UNIQUE KEY AID (AID, BID, CID, DID);

8

কোনও বিদেশী কী ক্ষেত্রে আপনার সূচি রাখতে হবে কারণ আপনি 'এইড' ফিল্ডে একটি সাধারণ সূচক তৈরি করতে পারেন

CREATE INDEX aid_index ON mytable (AID);

এবং কেবল তখনই অনন্য সূচক 'এইড' বাদ দিন

ALTER TABLE mytable DROP INDEX AID;

7

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

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

1
আপনার কাছে এমন তত্ত্ব আছে যা অন্য উত্তরগুলির অভাব ছিল।
ডেনিস

1
সুতরাং: আপনার যদি একটি যৌগিক অনন্য সূচক (এক অনন্য বাধার একাধিক কলাম) থাকে তবে আপনি অনন্য এবি কীটি সরাতে পারবেন না যদি আপনি A এবং B এর সূচক না পান তবে যদি আপনি এই ত্রুটিটি পান তবে অন্য একটি সারণী কলামের সূচকটি ব্যবহার করছে A বা বি, এবং আপনাকে নিরাপদে এবি ইউনিকটি মুছে ফেলার আগে আপনাকে সেগুলি যুক্ত করতে হবে।
রবিন ডি শ্যাপার

@ রবিনডেচেপার ভাল মন্তব্য। এবং যৌগিক অনন্য সূচকগুলি ব্যবহার করার সময়, ক্ষেত্রগুলির ক্রমটি অনন্য সূচকের জন্য গুরুত্বপূর্ণ নয়, তবে এটি কোনও বিদেশী কীর জন্য গুরুত্বপূর্ণ। এ, বি-তে একটি অনন্য সূচক এ-তে একটি বিদেশী কী দ্বারা ব্যবহার করা যেতে পারে, তবে বি-তে কোনও বিদেশী কী ব্যবহার করতে পারে না
স্টিফান মনডিলার্স

2

আমি মনে করি এটি সূচক বাদ দেওয়ার সহজ উপায়।

set FOREIGN_KEY_CHECKS=1;

ALTER TABLE mytable DROP INDEX AID;

set FOREIGN_KEY_CHECKS=0;

2
আমি মনে করি আপনি চেকগুলি সক্ষম এবং অক্ষম করে বিনিময় করেছেন। শীর্ষে আমি আশা করব FOREIGN_KEY_CHEK=0এবং শেষে থাকব FOREIGN_KEY_CHEK=1
রোমোর

0

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


0

আপনি যদি কোনও বিদেশী কী কলামটি (ড্রাইন একটি বাধা ধরে রাখেন) ড্রপ করতে চান তবে আপনাকে প্রথমে বিদেশী কীটি ড্রপ করা উচিত এবং তারপরে কলামটি ড্রপ করা উচিত, যখন আপনি বিদেশী কী ড্রপ করেন, আপনাকে সমস্ত নাম পাস করতে হবে না, কেবল বিদেশী কীটি পাস করুন কলামের নাম:

$table->dropForeign(['currency_id']);
$table->dropColumn('currency_id');

আরও বিশদ বিবরণ:

https://laravel.com/docs/6.x/migrations#foreign-key-constraints

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