ত্রুটি 1022 - লিখতে পারে না; টেবিলের নকল কী


218

টেবিল কমান্ড তৈরি করতে সদৃশ কী সম্পর্কে আমি একটি 1022 ত্রুটি পেয়েছি। কোয়েরিটি দেখে, আমি বুঝতে পারি না যে সদৃশটি কোথায় ঘটছে। অন্য কেউ এটি দেখতে পারেন?

SQL query:

-- -----------------------------------------------------
-- Table `apptwo`.`usercircle`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS  `apptwo`.`usercircle` (

 `idUserCircle` MEDIUMINT NOT NULL ,
 `userId` MEDIUMINT NULL ,
 `circleId` MEDIUMINT NULL ,
 `authUser` BINARY NULL ,
 `authOwner` BINARY NULL ,
 `startDate` DATETIME NULL ,
 `endDate` DATETIME NULL ,
PRIMARY KEY (  `idUserCircle` ) ,
INDEX  `iduser_idx` (  `userId` ASC ) ,
INDEX  `idcategory_idx` (  `circleId` ASC ) ,
CONSTRAINT  `iduser` FOREIGN KEY (  `userId` ) REFERENCES  `apptwo`.`user` (
`idUser`
) ON DELETE NO ACTION ON UPDATE NO ACTION ,
CONSTRAINT  `idcategory` FOREIGN KEY (  `circleId` ) REFERENCES  `apptwo`.`circle` (
`idCircle`
) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE = INNODB;

MySQL said: Documentation

#1022 - Can't write; duplicate key in table 'usercircle' 

4
যদি আমি সঠিকভাবে মনে রাখি, প্রাথমিক কীটি সর্বদা একটি অনন্য সূচক হয়, তাই আপনাকে কী অনন্য সূচক বিবৃতি ছেড়ে দিতে হবে?
Mr 47

1
ON DELETE NO ACTIONকেবলমাত্র বিদেশী কী ব্যবহারের পুরোপুরি বাদ দিন। আপনার যদি না করার খুব নির্দিষ্ট কারণ না থাকে।
অ্যামেজিংড্রিমগুলি

4
@ আমাজিংড্রিমস কেন? এটি এখনও রেফারেন্সিয়াল অখণ্ডতা প্রয়োগ করে। কেবলমাত্র আপনার নিজেরাই বাচ্চাদের মুছতে হবে। এটি ক্যাসকেড মুছে ফেলার চেয়ে নিরাপদ যেখানে আপনি কোনও ভুল কীওয়ার্ড মুছে ফেলার মাধ্যমে দুর্ঘটনাক্রমে প্রচুর ডেটা মুছতে পারবেন।
GolezTrol

1
stackoverflow.com/a/5810024/1567737 'এলিয়াসড' ব্যবহার করার সাথে সাথে একটি উলাম ব্যবহার করা কেন উদ্দেশ্যটি তাত্ক্ষণিকভাবে পরিষ্কার করে?
অ্যামেজিংড্রিমগুলি

@ আমাজিংড্রাইমস টিপটির জন্য ধন্যবাদ। আমি এটির চারপাশের বিতর্কটিও পছন্দ করি - এটি আমার পক্ষে কুফলগুলি সম্পর্কে জানতে সহায়তা করে।
গিট-সক্ষম

উত্তর:


534

নাম iduserবা idcategoryআপনার ডাটাবেসে আপনার ইতিমধ্যে কোনও বাধা রয়েছে । যদি সীমাবদ্ধ থাকে তবে কেবল নতুন নামকরণ করুন।

আপনি তৈরি / পরিবর্তন করছেন এমন নির্দিষ্ট সারণীর জন্য নয়, পুরো ডাটাবেসের জন্য সীমাবদ্ধতা অবশ্যই অনন্য হতে হবে।

সীমাবদ্ধতা বর্তমানে ব্যবহারে রয়েছে তা সন্ধান করতে আপনি নিম্নলিখিত কোয়েরিটি ব্যবহার করতে পারেন:

SELECT `TABLE_SCHEMA`, `TABLE_NAME`
FROM `information_schema`.`KEY_COLUMN_USAGE`
WHERE `CONSTRAINT_NAME` IN ('iduser', 'idcategory');

15
ঠিক যেমন আপনি বলেছেন। CREATE ক্যোয়ারির বাকী অংশগুলিতে একই প্রতিলিপি আইড্রেসার নাম সহ অনেকগুলি প্রতিবন্ধকতা স্বয়ংক্রিয়ভাবে উত্পন্ন হয়েছিল - আপনার সহায়তার জন্য ধন্যবাদ!
গিট-সক্ষম

1
আমি ভেবেছিলাম সৃষ্টি স্ক্রিপ্ট রফতানির সময় মাইএসকিউএল ওয়ার্কবেঞ্চ এটি ঠিক করে ফেলত, তবে আমি প্রকল্পটি যখন খুলি তখন এই ধরণের জিনিস সম্পর্কে "সতর্কতা অবলম্বন" করার জন্য আমি পাই।
স্নোইনফার্নো 0

ধন্যবাদ, সাথী :) এটি আমাকে অনেক সহায়তা করে এবং এখন বিদেশী কীগুলির জন্য আমার সম্মেলনটি আলাদা এবং আমি এই সমস্যাটি আবার দেখতে

তা নিশ্চিত করতে পারে। তবে রেফারেন্সড টেবিলটি ইতিমধ্যে বাদ দেওয়া সত্ত্বেও নামকরণের সীমাবদ্ধতা থাকলে আমি কী করতে পারি ?? আমি কি অস্তিত্বহীন টেবিল থেকে কোনও সীমাবদ্ধতা ফেলতে পারি? আমার ধারণা আমার MySQL 5.6 থেকে বর্তমান মারিয়াডিবিতে আপডেট করা উচিত।
আনসে

3
এর জন্য আপনাকে ধন্যবাদ: পুরো ডাটাবেসের জন্য সীমাবদ্ধতাগুলি অবশ্যই অনন্য হতে হবে
সেবাসির

31

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

আপনার সমস্ত সারণী এবং আপনার সমস্ত বিদেশী কীগুলি পরীক্ষা করুন এবং একই সঠিক নামের সাথে দুটি বিদেশী কী থাকা এড়ানো।


আমার ক্ষেত্রে এটাই সমস্যা ছিল। আমি কখনই অনুমান করতে পারতাম না এবং আপনি আমার দিনটি বাঁচিয়েছিলেন। এখন fk_id_1, fk_id_2 ইত্যাদি ব্যবহার করে। ধন্যবাদ।
JackLeEmmerdeur

15

সাফল্যের সাথে সমাধান করা এবং নামকরণ কনভেনশন দুটি লিঙ্ক থেকে আমি এই একই সমস্যাটি সহজেই সমাধান করেছি যার মুখোমুখি হয়েছিল। অর্থাত্, বিদেশী কী নামের জন্য, fk _colName_ টেবিলের নাম হিসাবে দিন । এই নামকরণ কনভেনশনটি দ্ব্যর্থহীন এবং এটি আপনার ডিবি মডেলের প্রতিটি বিদেশীকে অনন্য করে তোলে এবং আপনি কখনই এই ত্রুটি পাবেন না।

ত্রুটি 1022: লিখতে পারি না; টেবিলের নকল কী


6

অন্যরা যেমন উল্লেখ করেছে, আপনার সীমাবদ্ধতার নামটি ইতিমধ্যে আপনার ডিবিতে অন্য কোনও টেবিল দ্বারা ব্যবহৃত হয়েছে । তারা অবশ্যই ডাটাবেস জুড়ে অনন্য হতে হবে।

বিদেশী মূল সীমাবদ্ধতার নামকরণের জন্য একটি ভাল কনভেনশন হ'ল:

fk_TableName_ColumnName

কোনও সম্ভাব্য সংঘর্ষ রয়েছে কিনা তা খতিয়ে দেখার জন্য, আপনি এই কোয়েরির সাহায্যে আপনার ডাটাবেস দ্বারা ব্যবহৃত সমস্ত প্রতিবন্ধকতার তালিকা করতে পারেন:

SELECT * FROM information_schema.table_constraints WHERE constraint_schema = 'YOUR_DB';

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


4

আমি একই সমস্যাটি নিয়ে শেষ 4 ঘন্টা অতিবাহিত করেছি। আমি যা করেছি তা কেবল সীমাবদ্ধতার অনন্য নাম ছিল তা নিশ্চিত করা।

সীমাবদ্ধতার নাম পরিবর্তন করতে পারেন। আমি আমার সাথে একটি সংখ্যা যুক্ত করেছিলাম যাতে আমি সহজেই সংখ্যার সংখ্যাটি সনাক্ত করতে পারি।

উদাহরণ

যদি কোনও টেবিলের সীমাবদ্ধতার জন্য বিদেশী কী এক্সযুক্ত ছেলের নাম রাখা হয় তবে বিদেশী কী এক্স সহ পরবর্তী বাধাটিকে ছেলে 1 বলা যেতে পারে

আমি নিশ্চিত আপনি আমার চেয়ে ভাল নামগুলি খুঁজে পেতে চাইবেন। 🙂


3

পারকোনা টুলকিটের অনলাইন-স্কিমা-পরিবর্তন সরঞ্জামের নির্দিষ্ট সংস্করণগুলিতে একটি বাগের সাথেও এটি উত্থাপিত হতে পারে। একটি বড় টেবিলটি রূপান্তর করতে, pt-osc প্রথমে একটি সদৃশ টেবিল তৈরি করে এবং এতে সমস্ত রেকর্ড অনুলিপি করে। কিছু পরিস্থিতিতে, pt-osc 2.2.x এর কিছু সংস্করণ নতুন টেবিলের সীমাবদ্ধতা পুরানো টেবিলের সীমাবদ্ধতার মতো একই নাম দেওয়ার চেষ্টা করবে।

২.৩.০ এ একটি ফিক্স প্রকাশ হয়েছিল।

আরও তথ্যের জন্য https://bugs.launchpad.net/percona-toolkit/+bug/1498128 দেখুন ।


1

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


1

একটি নতুন টেবিল তৈরি করার সময় আমার এই সমস্যা হয়েছিল। এটি দিয়ে গেছে যে আমি দিয়েছি বিদেশী কী নামটি ইতিমধ্যে ব্যবহৃত ছিল। কীটির নামকরণ এটি স্থির করে।

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