বিদেশী কী সীমাবদ্ধতায় ব্যবহৃত কলাম পরিবর্তন করা যায় না


111

আমি যখন আমার টেবিলটি পরিবর্তন করার চেষ্টা করছিলাম তখন আমি এই ত্রুটিটি পেয়েছি।

Error Code: 1833. Cannot change column 'person_id': used in a foreign key constraint 'fk_fav_food_person_id' of table 'table.favorite_food'

এখানে আমার তৈরি টেবিল বিবরণ সফলভাবে চলেছে successfully

CREATE TABLE favorite_food(
    person_id SMALLINT UNSIGNED,
    food VARCHAR(20),
    CONSTRAINT pk_favorite_food PRIMARY KEY(person_id,food),
    CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
    REFERENCES person (person_id)
);

তারপরে আমি এই বিবৃতিটি কার্যকর করার চেষ্টা করেছি এবং উপরের ত্রুটিটি পেয়েছি।

ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;

4
উপরের উদাহরণটি "শেখা এসকিউএল, ২ য় সংস্করণ" বইটি থেকে। আমি আশা করি লেখক, অ্যালান বিউলিউ সংশোধন করেছেন।
দিমিত্রি

উত্তর:


126

বিদেশী কী ক্ষেত্র এবং রেফারেন্সের ধরণ এবং সংজ্ঞা অবশ্যই সমান হতে হবে। এর অর্থ আপনার বিদেশী কী আপনার ক্ষেত্রের ধরণ পরিবর্তন করতে দেয়।

এর একটি সমাধান হ'ল:

LOCK TABLES 
    favorite_food WRITE,
    person WRITE;

ALTER TABLE favorite_food
    DROP FOREIGN KEY fk_fav_food_person_id,
    MODIFY person_id SMALLINT UNSIGNED;

এখন আপনি ব্যক্তি_আইডি পরিবর্তন করতে পারেন

ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;

বিদেশী কী পুনরায় তৈরি করুন

ALTER TABLE favorite_food
    ADD CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
          REFERENCES person (person_id);

UNLOCK TABLES;

সম্পাদনা: উপরের তালিকাগুলি যুক্ত, মন্তব্যে ধন্যবাদ

এটি করার সময় আপনাকে ডাটাবেসে লিখিত অনুমতি দিতে হবে, অন্যথায় আপনি ডেটা অখণ্ডতার সমস্যার ঝুঁকি নিতে পারেন।

আমি উপরে একটি লেখার লক যুক্ত করেছি

আপনার নিজের ( INSERT, UPDATE, DELETE) ব্যতীত অন্য কোনও অধিবেশনে সমস্ত লেখার প্রশ্নাবলী সময়সীমা শেষ হওয়ার অপেক্ষা করবে বা UNLOCK TABLES; মৃত্যুদন্ড কার্যকর করা হয়

http://dev.mysql.com/doc/refman/5.5/en/lock-tables.html

সম্পাদনা 2: ওপি "বিদেশী কী ক্ষেত্রের ধরণ এবং রেফারেন্সের ধরণ এবং সংজ্ঞা অবশ্যই সমান হতে হবে This এর অর্থ আপনার বিদেশী কী আপনার ক্ষেত্রের ধরণ পরিবর্তন করার অনুমতি দেয় না" "

থেকে ফরেইন কী সীমাবদ্ধতাসমূহ: মাইএসকিউএল 5.5 রেফারেন্স ম্যানুয়াল

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


1
এই জন্য একটি লেনদেন ব্যবহার করতে ভুলবেন না। অন্যথায় আপনার ডাটাবেস দূষিত হতে পারে।
ফ্রাঙ্কোইস বুর্জোয়া 14

5
ভাল কথা, দুর্ভাগ্যক্রমে মাইএসকিউএল ডিডিএল স্টেটমেন্টগুলির চারপাশে লেনদেন সমর্থন করে না। ডিডিএল ক্যোয়ারি কার্যকর করার আগে খোলা লেনদেনগুলি করা হয় dev.mysql.com/doc/refman/5.5/en/implicit-commit.html
মিশেল

2
একটি বিদেশী কী পুনরায় তৈরি করার জন্য সঠিক বিবৃতিটি হ'ল: টেল ফেভারিট_ফুডের সাথে যুক্ত করুন fk_fav_food_Press_ID বিদেশী কী (person_id) রেফারেন্স ব্যক্তি (আইডি);
ফেলিজার্ডো

1
person_idবিদেশী কী বাদ দেওয়ার পরে আপনি কেন সংশোধন করবেন ? দেখে মনে হচ্ছে যে আপনি ইতিমধ্যে এটির কোনও পরিবর্তন করেন নি SMALLINT UNSIGNED
ডেনিস সুবাচেভ

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

198

আপনি বিদেশী কী চেক বন্ধ করতে পারেন:

SET FOREIGN_KEY_CHECKS = 0;

/* DO WHAT YOU NEED HERE */

SET FOREIGN_KEY_CHECKS = 1;

উত্পাদনে এটি ব্যবহার না করার এবং ব্যাকআপ নেওয়ার বিষয়টি নিশ্চিত করুন।


1
খুব সুরক্ষিত সমাধান বলে মনে হচ্ছে। এটি কীভাবে ডেটা অখণ্ডতা হ্রাস করতে পারে?
hrust

@ সিনাপস - হ্যাঁ আপনি যদি মুছে ফেলতে / আপডেট / সন্নিবেশ করিয়ে থাকেন তবে তা সম্ভব। আপনি যদি কেবল কোনও টেবিলটি সংশোধন করছেন বা আপনার ডিবি বীজ দিচ্ছেন তবে ডেটা ক্ষতি হ্রাস পাবে না অন্যদিকে আপনার নিজের ডেটা ম্যানুয়ালি বৈধ করে তোলা উচিত (যেহেতু আপনি সীমাবদ্ধতাগুলি সরিয়ে দেন)
ডেমেন্টিক

2
এই সমাধানটি দুর্দান্ত and সম্ভাব্য স্বল্পতম সময়ের মধ্যে আপনার পরিবর্তনগুলি করতে কোনও স্কাইল ফাইল ব্যবহার করা আরও ভাল better
ফ্রান্সিসকো জারাবোজো

দ্রুত
টুইটগুলির

1
SET FOREIGN_KEY_CHECKSসেশন-স্কোপড হিসাবে আপনার কোনও লক লাগবে না (অন্যান্য সেশনে এখনও এফকে সীমাবদ্ধতা প্রয়োগ করা হবে)। এটি যুক্ত / অপসারণের জন্য নিখুঁত AUTO_INCREMENT(যা প্রকৃত কলামের ডেটাটাইপ পরিবর্তন করে না) তবে আপনি "রিয়েল" (বলুন, ছোট থেকে আইএনটি হিসাবে) কলামের ডেটাটাইপ পরিবর্তন করার চেষ্টা করলে এটি কার্যকর হবে না কারণ আপনি বৈধ পাবেন 150 FK constraint incorrectly formedযখন mysql পুরানো টেবিলটি নতুন দ্বারা প্রতিস্থাপন করার চেষ্টা করে। এই ক্ষেত্রে, গৃহীত উত্তরটি ব্যবহার করুন।
জেনোস

-3

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


12
এই ধরনের একটি অকেজো, বেহুদা উত্তর!
আজাদওয়ে

3
@ আজমেডওয়ে এর পরে আপনি অন্য ব্যবহারকারীদের দোষ না দিয়ে একটি সহায়ক উত্তর লিখতে পারেন
আমি

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