কীভাবে আমার মাইএসকিউএল টেবিল থেকে সীমাবদ্ধতাগুলি সরিয়ে ফেলবেন?


252

আমি আমার টেবিল থেকে বাধা সরাতে চাই। আমার জিজ্ঞাসাটি হ'ল:

ALTER TABLE `tbl_magazine_issue` 
DROP CONSTRAINT `FK_tbl_magazine_issue_mst_users`

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

#1064- আপনার এসকিউএল সিনট্যাক্সে আপনার একটি ত্রুটি রয়েছে; FK_tbl_magazine_issue_mst_usersলাইন 1 এ 'সীমাবদ্ধতা ' কাছাকাছি ব্যবহার করতে ডান সিনট্যাক্সের জন্য আপনার মাইএসকিউএল সার্ভার সংস্করণের সাথে সম্পর্কিত ম্যানুয়ালটি পরীক্ষা করুন


1
এটি লক্ষণীয় যে আপনি যদি কোনও CHECKসীমাবদ্ধতা তৈরি করেন তবে এটিকে ফেলে দেওয়ার দরকার নেই কারণ প্রকৃত কোনও সীমাবদ্ধতা তৈরি হয় না। আপনি information_schema.table_constraintsযাচাই করতে চয়ন করতে পারেন এবং আপনি এমনকি add constraintকোনও ত্রুটি ছাড়াই বার বার চালাতে পারেন । মাইএসকিউএল CHECKসীমাবদ্ধতাগুলিকে সমর্থন করে না তবে এসকিউএল তাদের তৈরি করার উদ্দেশ্যে দেয় (আসলে সীমাবদ্ধতা তৈরি না করে)।
এডিটিসি



আপনার বাক্য
গঠনটি

উত্তর:


423

বিদেশী কী সীমাবদ্ধতাগুলি ফেলে দেওয়ার জন্য মাইএসকিএলের একটি বিশেষ বাক্য গঠন রয়েছে:

ALTER TABLE tbl_magazine_issue
  DROP FOREIGN KEY FK_tbl_magazine_issue_mst_users

21
পোস্টগ্রিস, এমএসএসকিউএল এবং ওরাকল সবই আছে alter table .. drop constraint। মাইএসকিউএল হ'ল বিজোড়।
জ্যারেড বেক

এটি বলে যে এটি "কলাম 2" বিচুসগুলি ড্রপ করতে পারে না এটি বিদেশী কী সীমাবদ্ধতার জন্য প্রয়োজন। যখন আপনি বলেছি আমি যখন করি আমি "ক্যান্ট ডিআরপি কলাম 2 পেয়েছি; সেই কলামটি / কী উপস্থিত আছে" দেখুন
লেওলো

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

1
ওয়েলিংটন লরিন্ডোর সমাধানটিকে আরও সঠিক হিসাবে দেখা যেতে পারে, কারণ কেবল বিদেশী কী সরিয়ে ফেললে সম্পর্কিত সূচি মুছে ফেলা হবে না। অবশ্যই সূচকটি পৃথকভাবে তৈরি করা হয়েছে, তবে এটি যদি প্রথম স্থানে বিদেশী কী যুক্ত করার ফলস্বরূপ তৈরি করা হয়েছিল, তবে কেবল বিদেশী কী বাদ দিয়ে তা সরানো হবে না।
রিচ হার্ডিং

55

আমারও একই সমস্যা ছিল এবং আমি এই কোডটি দিয়ে সমাধান করতে পারি:

ALTER TABLE `table_name` DROP FOREIGN KEY `id_name_fk`;
ALTER TABLE `table_name` DROP INDEX  `id_name_fk`;

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

3
একক কমান্ড হিসাবে: ALTER TABLE table_name DROP FOREIGN KEY IF EXISTS id_name_fk, DROP INDEX IF EXISTS id_name_fk;
ফ্র্যাঙ্ক ফোর্টাল

26

DROP CONSTRAINTমাইএসকিউএল তেমন কোনও জিনিস নেই । আপনার ক্ষেত্রে আপনি DROP FOREIGN KEYপরিবর্তে ব্যবহার করতে পারেন ।


12

সীমাবদ্ধতা যদি কোনও বিদেশী কী না হয়, যেমন। 'ইউনিক কনট্রন্ট (কোলা, কলবি) ব্যবহার করে একটি যুক্ত করা হয়েছে তবে এটি এমন একটি সূচক যা ব্যবহার করে বাদ পড়তে পারেALTER TABLE ... DROP INDEX ...


9

এছাড়াও দুর্দান্ত, আপনি একটি mysql ডাটাবেস থেকে সমস্ত বিদেশী কী চেকগুলি সাময়িকভাবে অক্ষম করতে পারেন: SET FOREIGN_KEY_CHECKS=0; এবং এটি আবার সক্ষম করতে: SET FOREIGN_KEY_CHECKS=1;


8

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

ALTER TABLE `table_name` DROP KEY `uc_name`;

অথবা

ALTER TABLE `table_name` DROP INDEX `uc_name`;

4

কিছু ওআরএম বা ফ্রেমওয়ার্কগুলি ডিফল্টের চেয়ে বিদেশী কীগুলির জন্য আলাদা নামকরণের কনভেনশন ব্যবহার করে FK_[parent table]_[referenced table]_[referencing field], কারণ এগুলি পরিবর্তন করা যায়।

উদাহরণস্বরূপ লারাভেল [parent table]_[referencing field]_foreignনামকরণ কনভেনশন হিসাবে ব্যবহার করে । আপনি এখানে যেমন দেখায় এই কোয়েরিটি ব্যবহার করে বিদেশী কীগুলির নামগুলি প্রদর্শন করতে পারেন :

SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE REFERENCED_TABLE_SCHEMA = '<database>' AND REFERENCED_TABLE_NAME = '<table>';

তারপরে উল্লিখিত DROP FOREIGN KEY কোয়েরি এবং এর সঠিক নামটি চালিয়ে বিদেশী কী সরিয়ে ফেলুন।


2

যারা এখানে মারিয়াডিবি ব্যবহার করে আসেন তাদের জন্য:

নোট করুন যে মারিয়াডিবি সাধারণভাবে ড্রপ কনট্রন্টের বিবৃতিগুলিকে মঞ্জুরি দেয়, উদাহরণস্বরূপ চেক সীমাবদ্ধতাগুলি ফেলে দেওয়ার জন্য:

ALTER TABLE table_name
DROP CONSTRAINT constraint_name;

https://mariadb.com/kb/en/library/alter-table/


হ্যাঁ, এটি একই সারণীর মধ্যে থাকা বাধাগুলির জন্য, উদাহরণস্বরূপ CONSTRAINT CHECK(a > b)। বিদেশী মূল সীমাবদ্ধতার জন্য, এটি এখনও আপনার DROP FOREIGN KEYসিনট্যাক্সের প্রয়োজন বলে মনে হচ্ছে , কমপক্ষে মারিয়াডিবি সংস্করণ 10.2
ফ্র্যাঙ্ক ফোর্টে

1
  1. টেবিলের কাঠামোর দৃশ্যে যান
  2. আপনি শীর্ষস্থানীয় উপর 2 বিকল্প দেখতে পাবেন। টেবিল কাঠামো খ। রিলেশন ভিউ
  3. এখন রিলেশন ভিউতে ক্লিক করুন , এখানে আপনি আপনার বিদেশী কী বাধা বাদ দিতে পারেন। আপনি এখানে সমস্ত সম্পর্ক পাবেন।

এটি দুর্দান্ত, আপনি যখন আইডিটি জানেন না তখন আমার পক্ষে কাজ করেছিলেন
সিলভিউ সেন্ট

0

DROP CONSTRAINTমাই এসকিএল-তে কোনও নেই । MySQL 5.7 এ যাদুটির মতো এই কাজ like

ALTER TABLE answer DROP KEY const_name;

0

সীমাবদ্ধতা অপসারণের সহজতম উপায় হ'ল মাইএসকিউএল 8.0.19 এALTER TABLE tbl_name DROP CONSTRAINT symbol; প্রবর্তিত সিনট্যাক্স ব্যবহার করা :

মাইএসকিউএল ৮.০.১৯ অনুসারে, অল্টার টেবিল যেকোন ধরণের বিদ্যমান সীমাবদ্ধতাগুলি ফেলে দেওয়ার ও পরিবর্তন করার জন্য আরও সাধারণ (এবং এসকিউএল স্ট্যান্ডার্ড) সিনট্যাক্সের অনুমতি দেয়, যেখানে সীমাবদ্ধতার নামটি সীমাবদ্ধতার নাম থেকে নির্ধারিত হয়

ALTER TABLE tbl_magazine_issue DROP CONSTRAINT FK_tbl_magazine_issue_mst_users;

ডিবি <> ফিডাল ডেমো


-4

এটি মাইএসকিউএলে সীমাবদ্ধতাগুলি ফেলে কাজ করবে

alter table tablename drop primary key;

alter table tablename drop foreign key;

DROP PRIMARY KEYকাজ করা উচিত নয়। DROP FOREIGN KEYকাজ কিন্তু আপনি যার কাছে নির্দিষ্ট করতে হবে drop। উদাহরণ হিসেবে বলা যায়ALTER TABLE tablename DROP FOREIGN KEY id_name_fk
RousseauAlexandre
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.