বিদেশী কী রেফারেন্সিয়াল অ্যাকশনটি কীভাবে পরিবর্তন করবেন? (আচরণ)


102

আমি একটি টেবিল সেট আপ করেছি যাতে একটি বিদেশী কী সহ একটি কলাম রয়েছে, সেট করা আছে ON DELETE CASCADE(পিতামাতার মুছে ফেলা হলে শিশুটিকে মুছুন)

এটিকে পরিবর্তন করতে এসকিউএল কমান্ডটি কী হবে ON DELETE RESTRICT? (সন্তান থাকলে পিতামাতাকে মুছতে পারে না)

উত্তর:


170

পুরানো প্রশ্ন তবে উত্তর যুক্ত করা যাতে কেউ সহায়তা পেতে পারে

এটির দুটি পদক্ষেপ প্রক্রিয়া:

মনে করুন, কলামের নাম সহ table1একটি বিদেশী কী রয়েছে fk_table2_id, বাধা নামের সাথে fk_nameএবং table2কী দিয়ে টেবিলটি উল্লেখ করা হয়েছে t2( আমার চিত্রের নীচে এর মতো কিছু )।

   table1 [ fk_table2_id ] --> table2 [t2]

প্রথম পদক্ষেপ , পুরানো চুক্তি ড্রপ: ( রেফারেন্স )

ALTER TABLE `table1` 
DROP FOREIGN KEY `fk_name`;  

বিজ্ঞপ্তি সীমাবদ্ধতা মুছে ফেলা হয়, কলাম মুছে ফেলা হয় না

দ্বিতীয় পদক্ষেপ , নতুন চুক্তি যুক্ত করুন:

ALTER TABLE `table1`  
ADD CONSTRAINT `fk_name` 
    FOREIGN KEY (`fk_table2_id`) REFERENCES `table2` (`t2`) ON DELETE CASCADE;  

সীমাবদ্ধতা যোগ করার পরে, কলামটি ইতিমধ্যে রয়েছে

উদাহরণ:

আমার একটি UserDetailsটেবিলটি টেবিলকে বোঝায় Users:

mysql> SHOW CREATE TABLE UserDetails;
:
:
 `User_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`Detail_id`),
  KEY `FK_User_id` (`User_id`),
  CONSTRAINT `FK_User_id` FOREIGN KEY (`User_id`) REFERENCES `Users` (`User_id`)
:
:

প্রথম ধাপ:

mysql> ALTER TABLE `UserDetails` DROP FOREIGN KEY `FK_User_id`;
Query OK, 1 row affected (0.07 sec)  

দ্বিতীয় ধাপ:

mysql> ALTER TABLE `UserDetails` ADD CONSTRAINT `FK_User_id` 
    -> FOREIGN KEY (`User_id`) REFERENCES `Users` (`User_id`) ON DELETE CASCADE;
Query OK, 1 row affected (0.02 sec)  

ফলাফল:

mysql> SHOW CREATE TABLE UserDetails;
:
:
`User_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`Detail_id`),
  KEY `FK_User_id` (`User_id`),
  CONSTRAINT `FK_User_id` FOREIGN KEY (`User_id`) REFERENCES 
                                       `Users` (`User_id`) ON DELETE CASCADE
:

2
আসল প্রশ্নটির অনুরোধ অনুসারে আপনি যে সীমাবদ্ধতাটি যুক্ত করেছেন সেটি কি মুছে ফেলা নিষিদ্ধ করা উচিত নয়?
নুমেনন

এহম, "ক্যাসকেড মুছে ফেলতে কী আছে" এবং কেন এটি প্রয়োজনীয়?
লেওলো

3
@ নুমনন রিস্ট্রাক্ট ডিফল্ট তাই আপনি উল্লেখ না করার পরে তা পেয়ে যান।

1
@ লিওলিও "ক্যাসকেড মুছে ফেলুন" এর অর্থ হ'ল যদি আপনি পিতামাতার টেবিল থেকে একটি সারি মুছে ফেলেন (এই ক্ষেত্রে ব্যবহারকারীরা) শিশু টেবিল থেকে সমস্ত রেফারেন্সিং সারি (ইউজারডিটেলস) মুছে ফেলা হয়।

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

21

আপনি যদি এটির নাম পরিবর্তন করতে ইচ্ছুক হন তবে আপনি একটি ক্যোয়ারিতে এটি করতে পারেন:

ALTER TABLE table_name
  DROP FOREIGN KEY `fk_name`,
  ADD CONSTRAINT `fk_name2` FOREIGN KEY (`remote_id`)
    REFERENCES `other_table` (`id`)
    ON DELETE CASCADE;

আপনার বড় টেবিল থাকলে ডাউনটাইম হ্রাস করতে এটি দরকারী।


12
ALTER TABLE DROP FOREIGN KEY fk_name;
ALTER TABLE ADD FOREIGN KEY fk_name(fk_cols)
            REFERENCES tbl_name(pk_names) ON DELETE RESTRICT;

2
সাহায্য করেছে আমাকে সমাধান খুঁজে ALTER TABLE table_name ADD...ON DELETE RESTRICT
Moak

3
না, fk_name বাধা নাম। এটি সরবরাহ করা .চ্ছিক। আমি নিশ্চিত না তবে সম্ভবত আপনি এটি ব্যবহার করে পুনরুদ্ধার করতে পারেন SHOW CREATE TABLE
পাস্কাল

1
অন ​​ক্যাসকেডে নিষেধাজ্ঞার উদ্দেশ্য সম্ভবত নয় not
jgreep

5

মনে রাখবেন যে বিদেশী কী মুছে ফেলার পরে মাইএসকিউএল একটি কলামে একটি সাধারণ সূচক রাখে। সুতরাং, যদি আপনার 'রেফারেন্স' কলামটি পরিবর্তন করতে হয় তবে আপনার এটি 3 ধাপে করা উচিত

  • আসল এফকে বাদ দিন
  • একটি সূচক (পূর্ববর্তী fk হিসাবে নাম ব্যবহার করে) ফেলে দিন drop index ক্লজ )
  • নতুন এফকে তৈরি করুন

3

এগুলি সমস্তকে নিয়ম করতে আপনি কেবল একটি প্রশ্নের ব্যবহার করতে পারেন: ALTER TABLE products DROP FOREIGN KEY oldConstraintName, ADD FOREIGN KEY (product_id, category_id) REFERENCES externalTableName (foreign_key_name, another_one_makes_composite_key) ON DELETE CASCADE ON UPDATE CASCADE


1
এটি কেবল তখনই কার্যকর হবে যখন আপনি সীমাবদ্ধতার নাম পরিবর্তন করেন (যদি কোনও স্বয়ংক্রিয়ভাবে উত্পাদিত নাম ব্যবহার করা সম্ভবত এটি কাজ করবে, অনুমান করুন মাইএসকিউএল সর্বদা অনন্য তৈরি করে)
জর্জ বীরবিলিস

ক্যোয়ারী মাইএসকিউএল / মারিয়াডিবিতে নিশ্চিতভাবে কাজ করে। এখানে মূল কথাটি হ'ল এটির নামে পুরানো বাধা ফেলে দেওয়া, যা ২ য় লাইনে করা হচ্ছে
স্ট্যামস্টার

1
সমস্ত ইন-
ক্যোরিয়াম

3

পরিবর্তন করতে আমার একগুচ্ছ এফকে ছিল, তাই আমার পক্ষে বিবৃতি দেওয়ার জন্য আমি কিছু লিখেছিলাম। ভেবেছি আমি শেয়ার করছি:

SELECT

CONCAT('ALTER TABLE `' ,rc.TABLE_NAME,
    '` DROP FOREIGN KEY `' ,rc.CONSTRAINT_NAME,'`;')
, CONCAT('ALTER TABLE `' ,rc.TABLE_NAME,
    '` ADD CONSTRAINT `' ,rc.CONSTRAINT_NAME ,'` FOREIGN KEY (`',kcu.COLUMN_NAME,
    '`) REFERENCES `',kcu.REFERENCED_TABLE_NAME,'` (`',kcu.REFERENCED_COLUMN_NAME,'`) ON DELETE CASCADE;')

FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
LEFT OUTER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu
    ON kcu.TABLE_SCHEMA = rc.CONSTRAINT_SCHEMA
    AND kcu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME
WHERE DELETE_RULE = 'NO ACTION'
AND rc.CONSTRAINT_SCHEMA = 'foo'

1
সীমাবদ্ধতা একাধিক কলামে থাকলে এটি কাজ করবে না। উত্পন্ন স্কয়ার প্রতিটি কলামের জন্য পৃথক প্রতিবন্ধকতা তৈরি করবে
আলোকিত করবে

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