ত্রুটি কোড: 1005. টেবিল তৈরি করতে পারে না '...' (ভুল: 150)


103

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

আমি টেবিল সীরা_না থেকে ধাতব_কোডে একটি বিদেশী কী তৈরি করতে চাই।

ALTER TABLE sira_no
    ADD CONSTRAINT METAL_KODU FOREIGN KEY(METAL_KODU)
    REFERENCES metal_kod(METAL_KODU)
    ON DELETE SET NULL
    ON UPDATE SET NULL ;

এই স্ক্রিপ্ট ফেরত:

Error Code: 1005. Can't create table 'ebs.#sql-f48_1a3' (errno: 150)

আমি রেফারেন্স সারণিতে একটি সূচক যুক্ত করার চেষ্টা করেছি:

CREATE INDEX METAL_KODU_INDEX ON metal_kod (METAL_KODU);

আমি উভয় টেবিলগুলিতে METAL_KODU পরীক্ষা করেছি (চরসেট এবং কোলেশন), তবে আমি এই সমস্যার সমাধান খুঁজে পাইনি। আমি কিভাবে এই সমস্যা ঠিক করতে পারবো?

এখানে ধাতব_ কোড টেবিল:

METAL_KODU    varchar(4)    NO    PRI
DURUM    bit(1)    NO
METAL_ISMI    varchar(30)    NO
AYAR_YOGUNLUK    smallint(6)    YES        100

আপনি কি metal_kodটেবিলের জন্য স্কিমা প্রদর্শন করতে পারেন ... সেই টেবিলের কোন ক্ষেত্রটি বিদেশী কী উল্লেখ করা উচিত?
মানসে

উত্তর:


271

ত্রুটি কোড: 1005 - আপনার কোডটিতে একটি ভুল প্রাথমিক কী রেফারেন্স রয়েছে

সাধারণত এটি কোনও রেফারেন্সযুক্ত বিদেশী কী ক্ষেত্রের কারণে বিদ্যমান যার অস্তিত্ব নেই। এটি হতে পারে আপনার একটি টাইপ ভুল হয়েছে, বা এটি একই হওয়া উচিত কিনা তা যাচাই করুন বা ক্ষেত্রের মতো মিল নেই। বিদেশী কী-সংযুক্ত ক্ষেত্রগুলি অবশ্যই সংজ্ঞাগুলির সাথে মেলে।

কিছু জানা কারণ হতে পারে:

  1. দুটি কী ক্ষেত্র টাইপ এবং / অথবা আকার হুবহু মিলে না। উদাহরণস্বরূপ, যদি এক INT(10)কী ক্ষেত্র চাহিদা হতে INT(10)পাশাপাশি এবং INT(11)বা TINYINT। ব্যবহার করে আপনি ক্ষেত্র আকার নিশ্চিত করতে চাইতে পারেন SHOW CREATE TABLEকারণ ক্যোয়ারী ব্রাউজার কখনও কখনও দৃশ্যত মাত্র দেখাবে INTEGERউভয়ের জন্য INT(10)এবং INT(11)। আপনারও এটি পরীক্ষা করা উচিত যে একটিটি নয় SIGNEDএবং অন্যটি UNSIGNED। তাদের দুজনেরই একই রকম হওয়া দরকার।
  2. আপনি যে কী ক্ষেত্রটি উল্লেখ করার চেষ্টা করছেন তার একটিতে একটি সূচক নেই এবং / অথবা একটি প্রাথমিক কী নয়। সম্পর্কের ক্ষেত্রগুলির মধ্যে একটি যদি প্রাথমিক কী না হয় তবে আপনাকে অবশ্যই এই ক্ষেত্রের জন্য একটি সূচক তৈরি করতে হবে।
  3. বিদেশী কী নামটি ইতিমধ্যে বিদ্যমান কীটির একটি সদৃশ। আপনার বিদেশী কী এর নামটি আপনার ডাটাবেসের মধ্যে স্বতন্ত্র। এটির পরীক্ষা করার জন্য আপনার মূল নামের শেষে কয়েকটি এলোমেলো অক্ষর যুক্ত করুন।
  4. আপনার এক বা উভয় টেবিল একটি MyISAMটেবিল। বিদেশী কীগুলি ব্যবহার করতে, টেবিলগুলি উভয়ই হতে হবে InnoDB। (আসলে, যদি উভয় টেবিল থাকে MyISAMতবে আপনি একটি ত্রুটি বার্তা পাবেন না - এটি কীটি তৈরি করবে না)) কোয়েরি ব্রাউজারে, আপনি সারণির প্রকারটি নির্দিষ্ট করতে পারেন।
  5. আপনি একটি ক্যাসকেড নির্দিষ্ট করেছেন ON DELETE SET NULL, তবে সংশ্লিষ্ট কী ক্ষেত্র সেট করা আছে NOT NULL। আপনি নিজের ক্যাসকেড পরিবর্তন করে বা NULLমানকে অনুমতি দেওয়ার জন্য ক্ষেত্রটি সেট করে এটি ঠিক করতে পারেন ।
  6. নিশ্চিত হয়ে নিন যে কী কলামগুলির জন্য পৃথক ক্ষেত্র স্তরের পাশাপাশি টেবিল স্তরে চারসেট এবং কোলেটের বিকল্পগুলি উভয়ই সমান।
  7. আপনার বিদেশী কী কলামে আপনার একটি ডিফল্ট মান (যা ডিফল্ট = 0) রয়েছে
  8. সম্পর্কের ক্ষেত্রগুলির একটি হ'ল সংমিশ্রণ (সংমিশ্রিত) কী এর অংশ এবং এর নিজস্ব স্বতন্ত্র সূচক নেই। যদিও ক্ষেত্রটির সম্মিলিত কী এর অংশ হিসাবে একটি সূচক রয়েছে, আপনার কেবলমাত্র সেই মূল ক্ষেত্রটির জন্য সীমাবদ্ধতার জন্য এটির জন্য পৃথক সূচক তৈরি করতে হবে।
  9. আপনার ALTERবিবৃতিতে একটি সিনট্যাক্স ত্রুটি রয়েছে বা আপনি সম্পর্কের ক্ষেত্রে কোনও একটি ফিল্ডের নামটি ভুল টাইপ করেছেন
  10. আপনার বিদেশী কী এর নামটি সর্বাধিক 64 অক্ষরের দৈর্ঘ্য ছাড়িয়েছে।

আরও তথ্যের জন্য, দেখুন: মাইএসকিউএল ত্রুটি নম্বর 1005 সারণী তৈরি করতে পারে না


4
সমস্যাটি হ'ল বিদেশী কী অক্ষরগুলি মিলছে না। উত্তর করার জন্য ধন্যবাদ.
লমোস্ট্রেটা

4
SHOW ENGINE INNODB STATUSযেমন উল্লেখ এই প্রশ্নের সাহায্য করেছে আমাকে আমার বিশেষ সমস্যা নির্ণয় (PEBCAK, আমার ক্ষেত্রে ...)
ভবঘুরে লোক

1
জঘন্য, এমনকি এটি একটি প্রাথমিক কী। আপনাকে এই কীটির জন্য পৃথক সূচি তৈরি করতে হবে। ধন্যবাদ এই আমার সমস্যার সমাধান।
আরএসবি

3
# 4 আমার সমস্যা ছিল - টেবিলগুলির মধ্যে একটি ছিল মাইআইএসএএম এবং স্ক্রিপ্টটি একটি ইনোডিবি টেবিল তৈরি করার চেষ্টা করেছিল। আমি প্রাথমিকভাবে মাইএসকিউএল 5.0 বা অনুরূপ সংস্করণ চালিত একটি পুরানো সিস্টেম স্থাপনের চেষ্টা করার সময় আমি এই সমস্যার মধ্যে পড়েছিলাম, যেখানে ডিফল্ট স্টোরেজ ইঞ্জিনটি মাইআইএসএএম ছিল এবং স্ক্রিপ্টগুলি ঠিকঠাক চলছিল। আমার বর্তমান পরিবেশ 5.5 এবং ডিফল্ট স্টোরেজটি InnoDB। set names 'utf8', storage_engine=MYISAM;স্ক্রিপ্টের শুরুতে যুক্ত করা আমার জন্য সমস্যাটি সমাধান করেছে। বিস্তৃত উত্তরের জন্য আপনাকে @ ইউজার 319198 এবং @ স্টেফানোকে ধন্যবাদ! : ও)
বোরিস চেরভেনকভ

1
আমার # 1 তে উল্লিখিত 'স্বাক্ষরবিহীন' গুণটি অনুপস্থিত ছিল, ধন্যবাদ!
হেলভেট

11

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

কেবল আপনার স্ক্রিপ্টে নিম্নলিখিতগুলি যুক্ত করুন:

SET FOREIGN_KEY_CHECKS=0;

এবং এটি কাজ করবে।


4

খুব প্রায়ই এটি ঘটে যখন বিদেশী কী এবং রেফারেন্স কী একই ধরণের বা একই দৈর্ঘ্য না থাকে।


4

কখনও কখনও এটি মাস্টার সারণী বাদ দেওয়ার কারণে হয় (সম্ভবত বিদেশী_কি_চেকগুলি অক্ষম করে), তবে বিদেশী কী চুক্তিটি এখনও অন্য টেবিলগুলিতে বিদ্যমান। ইন আমার ক্ষেত্রে আমি টেবিল নেমে ছিল এবং এটি পুনঃ চেষ্টা করেছি, কিন্তু এটা আমার জন্য একই ভুল নিক্ষেপ করা হয়।

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


2

আমারও তেমন ত্রুটি হয়েছিল সমস্যাটি শিশু এবং পিতামাতার টেবিলের সাথে একই চরসেট এবং কোলেশন না থাকার সাথে হয়েছিল। এটি ENGINE = InnoDB ডিফল্ট চরিত্র সেট = utf8 যোগ করে স্থির করা যেতে পারে;

CREATE TABLE IF NOT EXISTS `country` (`id` INT(11) NOT NULL AUTO_INCREMENT,...) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;

... এসকিউএল বিবৃতিতে এর অর্থ হ'ল কিছু অনুপস্থিত কোড রয়েছে।


2

বৈদেশিক কীটিতে প্রাইমারি কীটি উল্লেখ করা হয় ঠিক একই ধরণের থাকতে হবে। উদাহরণস্বরূপ, "INT UNSIGNED NULL NET" টাইপ রয়েছে, ফরিং কীটিতে "INSIGNED NULL" থাকতে হবে

CREATE TABLE employees(
id_empl INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id)
);
CREATE TABLE offices(
id_office INT UNSIGNED NOT NULL AUTO_INCREMENT,
id_empl INT UNSIGNED NOT NULL,
PRIMARY KEY(id),
CONSTRAINT `constraint1` FOREIGN KEY (`id_empl`) REFERENCES `employees` (`id_empl`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='my offices';

স্বাক্ষরযুক্ত আমার জন্য সমস্যা ছিল। ধন্যবাদ!
গাবো

2

ত্রুটি কোড: 1005

আমারও অনুরূপ সমস্যা ছিল, সুতরাং এখানে কয়েকটি জিনিস রয়েছে যা আমি চেষ্টা করেছিলাম (কোনও ক্রমে নয়, সমাধান ব্যতীত :))

  1. বিদেশী কী নাম পরিবর্তন করা হয়েছে (এটি কার্যকর হয়নি)
  2. বিদেশী কী দৈর্ঘ্য হ্রাস পেয়েছে
  3. ডেটাটাইপগুলি যাচাই করা হয়েছে (কোনোকিছুই ভুল করবেন না)
  4. সূচী পরীক্ষা করুন
  5. কোলেশনগুলি পরীক্ষা করুন (সবকিছু সূক্ষ্ম, আবার রঙ করুন)
  6. ভাল ব্যবহারের টেবিলটি কেটে দেওয়া হয়েছে
  7. টেবিলটি ফেলে দিয়ে আবার তৈরি করা হয়েছে
  8. কোনও বৃত্তাকার রেফারেন্স তৈরি হচ্ছে কিনা তা দেখার চেষ্টা করা হয়েছে --- সব ঠিক আছে
  9. অবশেষে, আমি দেখলাম আমার দুটি সম্পাদক খোলা আছে। একটি পিএইচপিস্টোরমে (জেটব্রেইনস) এবং অন্যটি মাইএসকিউএল ওয়ার্কবেঞ্চে। দেখে মনে হচ্ছে পিএইচপিস্টোরম / মাইএসকিউএল ওয়ার্কবেঞ্চ একরকম সম্পাদনা লক তৈরি করে।

    লকিংয়ের ঘটনাটি ছিল কিনা তা পরীক্ষা করার জন্য আমি পিএইচপিস্টোরম বন্ধ করে দিয়েছি (এটি অন্য উপায়ে হতে পারে)। এটি আমার সমস্যার সমাধান করেছে।


2

আমি খুব একই ত্রুটি বার্তা ছিল। অবশেষে আমি বুঝতে পারি আমি কমান্ডের টেবিলের নামটি ভুল বানান করেছি:

ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES country (id);

বনাম

ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES countries (id);

আমি আশ্চর্য হই যে পৃথিবীতে মাইএসকিউএল কেন এমন টেবিলের অস্তিত্ব বলতে পারে না ...


1

মাইআইএসএএম সবেমাত্র উল্লেখ করা হয়েছে। কেবল ENGINE = মাইসাম ডিফল্ট চিয়ারসেট = ল্যাটিন 1 আউটপুট ক্রিমেন্ট = 2 যুক্ত করার চেষ্টা করুন ; বিবৃতি শেষে, ধরে নিলাম যে আপনার অন্যান্য টেবিলগুলি মাইআইএসএএম দিয়ে তৈরি করা হয়েছিল।

CREATE TABLE IF NOT EXISTS `tablename` (
  `key` bigint(20) NOT NULL AUTO_INCREMENT,
  FOREIGN KEY `key` (`key`) REFERENCES `othertable`(`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

1

আমার ক্ষেত্রে এটি ঘটেছিল যখন একটি টেবিলটি ইনোবি এবং অন্যটি মাইআইএসএএম। মাইএসকিউএল ওয়ার্কবেঞ্চের মাধ্যমে একটি টেবিলের ইঞ্জিন পরিবর্তন করা আমার জন্য সমাধান করে।


1

আমার ক্ষেত্রে এটি ঘটেছে, কারণ সীমাবদ্ধতার ঘোষণায় সারণির নাম উল্লেখ করা সঠিক ছিল না (আমি টেবিলের নামের উপরের অংশটি ভুলে গেছি):

ALTER TABLE `Window` ADD CONSTRAINT `Windows_ibfk_1` FOREIGN KEY (`WallId`) REFERENCES `Wall` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

1

উভয় টেবিলের পরীক্ষা করুন একই স্কিমা ইনোডিবি মাইআইএসএএম রয়েছে। আমি তাদের ক্ষেত্রে InnoDB এ সবই এক করে করেছি এবং কাজ করেছি


1

আমার সমস্যাটি তালিকাভুক্ত ছিল না, এটি এত নির্বোধ কিছু ছিল ..... FKপিকে যে টেবিলটি রয়েছে এটি একটি সংমিশ্রণ PKছিল যা এইভাবে ঘোষিত হয়েছিল: প্রাথমিক কী ( CNPJ, CEP) আমি চাইছিলাম যে সিইপি ফিল্ডটি FKঅন্য টেবিলে থাকবে এবং আমি ছিলাম এই ত্রুটির মধ্যে আটকে, গল্পের নৈতিকটি কেবলমাত্র প্রাথমিক কী ( CEP, CNPJ) এর জন্য উপরের কোডটিকে উল্টে দিয়েছে এবং এটি কার্যকর হয়েছে। তাদের বন্ধুদের টিপস পান।

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