รหัสข้อผิดพลาด: 1005 ไม่สามารถสร้างตาราง '…' (errno: 150)


103

ฉันค้นหาวิธีแก้ไขปัญหานี้บนอินเทอร์เน็ตและตรวจสอบคำถาม Stack Overflow แต่ไม่มีวิธีแก้ไขใดที่ใช้ได้กับกรณีของฉัน

ฉันต้องการสร้างคีย์ต่างประเทศจากตาราง sira_no เป็น metal_kod

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_kod:

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

คุณสามารถแสดงสคีมาสำหรับmetal_kodตาราง ... ฟิลด์ใดในตารางนั้นที่ Foreign Key ควรอ้างอิง
Manse

คำตอบ:


271

รหัสข้อผิดพลาด: 1005 - มีการอ้างอิงคีย์หลักไม่ถูกต้องในรหัสของคุณ

โดยปกติจะเกิดจากฟิลด์คีย์นอกที่อ้างอิงซึ่งไม่มีอยู่ อาจเป็นเพราะคุณพิมพ์ผิดหรือตรวจสอบกรณีที่ควรจะเหมือนกันหรือมีประเภทฟิลด์ไม่ตรงกัน ช่องที่เชื่อมโยงคีย์ต่างประเทศต้องตรงกับคำจำกัดความทุกประการ

สาเหตุที่ทราบบางประการอาจเป็น:

  1. ช่องคีย์สองช่องพิมพ์และ / หรือขนาดไม่ตรงกันทุกประการ ตัวอย่างเช่นหากมีINT(10)ความต้องการข้อมูลที่สำคัญในการเป็นINT(10)เป็นอย่างดีและไม่ได้หรือINT(11) TINYINTคุณอาจต้องการที่จะยืนยันขนาดเขตโดยใช้SHOW CREATE TABLEเพราะแบบสอบถามเบราว์เซอร์บางครั้งจะแสดงเพียงสายตาINTEGERของทั้งสองและINT(10) INT(11)นอกจากนี้คุณควรตรวจสอบว่าหนึ่งไม่ได้SIGNEDและอื่น ๆ UNSIGNEDคือ ทั้งคู่ต้องเหมือนกันทุกประการ
  2. หนึ่งในฟิลด์คีย์ที่คุณพยายามอ้างอิงไม่มีดัชนีและ / หรือไม่ใช่คีย์หลัก หากฟิลด์ใดฟิลด์หนึ่งในความสัมพันธ์ไม่ใช่คีย์หลักคุณต้องสร้างดัชนีสำหรับฟิลด์นั้น
  3. ชื่อคีย์ต่างประเทศซ้ำกับคีย์ที่มีอยู่แล้ว ตรวจสอบว่าชื่อของ Foreign Key ไม่ซ้ำกันในฐานข้อมูลของคุณ เพียงเพิ่มอักขระสุ่มสองสามตัวต่อท้ายชื่อคีย์ของคุณเพื่อทดสอบสิ่งนี้
  4. ตารางหนึ่งหรือทั้งสองตารางคือMyISAMตาราง InnoDBเพื่อที่จะใช้ปุ่มต่างประเทศตารางทั้งสองจะต้อง (จริงๆแล้วถ้าทั้งสองตารางเป็นMyISAMแล้วคุณจะไม่ได้รับข้อความแสดงข้อผิดพลาด - มันจะไม่สร้างคีย์) ใน Query Browser คุณสามารถระบุประเภทตารางได้
  5. คุณได้ระบุน้ำตกแต่ข้อมูลสำคัญที่เกี่ยวข้องมีการตั้งค่าON DELETE SET NULL NOT NULLคุณสามารถแก้ไขได้โดยการเปลี่ยนน้ำตกหรือตั้งค่าฟิลด์เพื่ออนุญาตNULLค่า
  6. ตรวจสอบให้แน่ใจว่าตัวเลือก Charset และ Collate เหมือนกันทั้งในระดับตารางและระดับเขตข้อมูลแต่ละรายการสำหรับคอลัมน์หลัก
  7. คุณมีค่าเริ่มต้น (นั่นคือค่าเริ่มต้น = 0) ในคอลัมน์คีย์นอกของคุณ
  8. ฟิลด์หนึ่งในความสัมพันธ์เป็นส่วนหนึ่งของคีย์ผสม (คอมโพสิต) และไม่มีดัชนีของตัวเอง แม้ว่าฟิลด์นั้นจะมีดัชนีเป็นส่วนหนึ่งของคีย์คอมโพสิต แต่คุณต้องสร้างดัชนีแยกต่างหากสำหรับฟิลด์คีย์นั้นเท่านั้นเพื่อที่จะใช้ในข้อ จำกัด
  9. คุณมีข้อผิดพลาดทางไวยากรณ์ในALTERคำสั่งของคุณหรือคุณพิมพ์ชื่อเขตข้อมูลในความสัมพันธ์ผิด
  10. ชื่อของคีย์ภายนอกของคุณมีความยาวเกินความยาวสูงสุด 64 อักขระ

สำหรับรายละเอียดเพิ่มเติมโปรดดูที่: MySQL Error Number 1005 ไม่สามารถสร้างตารางได้


4
ปัญหาคือชุดตัวอักษรคีย์ต่างประเทศไม่ตรงกัน ขอบคุณสำหรับคำตอบ.
lamostreta

4
SHOW ENGINE INNODB STATUSดังที่ได้กล่าวไว้ในคำถามนี้ช่วยให้ฉันวินิจฉัยปัญหาเฉพาะของฉันได้ (PEBCAK ในกรณีของฉัน ... )
โฮโบ

1
แม้ว่ามันจะเป็นคีย์หลักก็ตาม คุณต้องสร้างดัชนีแต่ละรายการสำหรับคีย์นั้น ขอบคุณสิ่งนี้ช่วยแก้ปัญหาของฉันได้
RSB

3
# 4 เป็นปัญหาของฉัน - หนึ่งในตารางคือ MyISAM และสคริปต์พยายามสร้างตาราง InnoDB ฉันพบปัญหานี้เมื่อฉันพยายามปรับใช้ระบบเก่าที่เริ่มต้นใช้งาน MySQL 5.0 หรือเวอร์ชันที่คล้ายกันโดยที่เอ็นจินหน่วยเก็บข้อมูลเริ่มต้นคือ MyISAM และสคริปต์ทำงานได้ตามปกติ สภาพแวดล้อมปัจจุบันของฉันคือ 5.5 และที่เก็บข้อมูลเริ่มต้นคือ InnoDB การเพิ่มset names 'utf8', storage_engine=MYISAM;ในตอนต้นของสคริปต์ช่วยแก้ปัญหาให้ฉันได้ ขอบคุณ @ user319198 และ @Stefano สำหรับคำตอบที่ละเอียด! : o)
Boris Chervenkov

1
ของฉันไม่มีแอตทริบิวต์ "ไม่ได้ลงชื่อ" ตามที่ระบุไว้ใน # 1 ขอบคุณ!
helvete

11

สิ่งนี้อาจเกิดขึ้นเมื่อส่งออกฐานข้อมูลของคุณจากเซิร์ฟเวอร์หนึ่งไปยังอีกเซิร์ฟเวอร์หนึ่งและตารางจะแสดงรายการตามลำดับตัวอักษรตามค่าเริ่มต้น
ดังนั้นตารางแรกของคุณอาจมีคีย์นอกของตารางอื่นที่ยังไม่ได้สร้าง ในกรณีเช่นนี้ให้ปิดใช้งาน Foreign_key_checks และสร้างฐานข้อมูล

เพียงเพิ่มสิ่งต่อไปนี้ในสคริปต์ของคุณ:

SET FOREIGN_KEY_CHECKS=0;

และมันจะได้ผล


4

บ่อยครั้งที่เกิดขึ้นเมื่อ Foreign Key และ Reference Key ไม่มีประเภทเดียวกันหรือมีความยาวเท่ากัน


4

บางครั้งอาจเป็นเพราะตารางหลักหลุด (อาจจะโดยการปิดใช้งาน Foreign_key_checks) แต่ CONSTRAINT คีย์ต่างประเทศยังคงมีอยู่ในตารางอื่น ในกรณีของฉันฉันล้มโต๊ะและพยายามสร้างมันขึ้นมาใหม่ แต่มันทำให้ฉันเกิดข้อผิดพลาดเดียวกัน

ดังนั้นลองทิ้งข้อ จำกัด ของคีย์ต่างประเทศทั้งหมดจากตารางทั้งหมดหากมีแล้วอัปเดตหรือสร้างตาราง


2

ฉันมีข้อผิดพลาดที่คล้ายกัน ปัญหาเกี่ยวข้องกับตารางย่อยและตารางหลักที่ไม่มีชุดอักขระและการเรียงลำดับเดียวกัน สามารถแก้ไขได้โดยต่อท้าย ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;

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

... ในคำสั่ง SQL หมายความว่ามีโค้ดบางส่วนหายไป


2

คีย์ต่างประเทศต้องมีประเภทเดียวกับคีย์หลักที่อ้างอิง ตัวอย่างเช่นมีประเภท "INT UNSIGNED NOT NULL" คีย์ข้างหน้ายังต้อง "INT UNSIGNED NOT 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';

การไม่ได้ลงนามเป็นปัญหาสำหรับฉัน ขอบคุณ!
Gabo

2

รหัสข้อผิดพลาด: 1005

ฉันมีปัญหาที่คล้ายกันดังนั้นนี่คือบางสิ่งที่ฉันได้ลอง (ไม่ใช่ในลำดับใด ๆ ยกเว้นวิธีแก้ปัญหา :))

  1. เปลี่ยนชื่อคีย์ต่างประเทศ (ใช้ไม่ได้)
  2. ลดความยาวคีย์ต่างประเทศ
  3. ตรวจสอบประเภทข้อมูลแล้ว (ไม่มีอะไรผิดพลาด)
  4. ตรวจสอบดัชนี
  5. ตรวจสอบการเรียง (ทุกอย่างเรียบร้อยดีอีกครั้ง)
  6. ตัดตารางไม่มีประโยชน์
  7. ทิ้งตารางแล้วสร้างใหม่
  8. พยายามดูว่ามีการสร้างการอ้างอิงแบบวงกลมหรือไม่ - ดีทั้งหมด
  9. ในที่สุดฉันก็เห็นว่าฉันมีบรรณาธิการสองคนเปิดอยู่ หนึ่งใน PhpStorm (JetBrains) และโต๊ะทำงาน MySQL อื่น ๆ ดูเหมือนว่า PhpStorm / MySQL Workbench จะสร้างการล็อคการแก้ไขบางอย่าง

    ฉันปิด PhpStorm เพียงเพื่อตรวจสอบว่ามีการล็อกหรือไม่ (อาจเป็นวิธีอื่นก็ได้) สิ่งนี้ช่วยแก้ปัญหาของฉันได้


2

ฉันมีข้อความแสดงข้อผิดพลาดเดียวกัน ในที่สุดฉันก็พบว่าฉันสะกดชื่อตารางในคำสั่งผิด:

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

เทียบกับ

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

ฉันสงสัยว่าทำไมบนโลก MySQL ไม่สามารถบอกได้ว่าไม่มีตารางดังกล่าว ...


1

มีการกล่าวถึง MyISAM เพียงลองเพิ่มENGINE = MyISAM DEFAULT CHARSET = latin1 AUTO_INCREMENT = 2; ในตอนท้ายของคำสั่งสมมติว่าตารางอื่นของคุณสร้างขึ้นด้วย MyISAM

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

ในกรณีของฉันมันเกิดขึ้นเมื่อโต๊ะหนึ่งเป็น InnoB และอีกโต๊ะคือ MyISAM การเปลี่ยนเอ็นจิ้นของตารางเดียวผ่าน MySQL Workbench ช่วยแก้ปัญหาให้ฉัน


1

มันเกิดขึ้นในกรณีของฉันเนื่องจากชื่อของตารางที่อ้างอิงในการประกาศข้อ จำกัด ไม่ถูกต้อง (ฉันลืมตัวพิมพ์ใหญ่ในชื่อตาราง):

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

1

ตรวจสอบทั้งสองตารางมีสคีมา InnoDB MyISAM เดียวกัน ฉันทำให้มันเหมือนกันทั้งหมดในกรณีของฉัน InnoDB และใช้งานได้


1

ปัญหาของฉันไม่อยู่ในรายการมันเป็นอะไรที่งี่เง่ามาก ..... ตารางที่มีFKPK เป็นคอมโพสิตPKที่ประกาศแบบนี้คีย์หลัก ( CNPJ, CEP) ฉันต้องการให้ฟิลด์ CEP อยู่FKในตารางอื่นและฉันก็ ติดอยู่ในข้อผิดพลาดนี้คุณธรรมของเรื่องราวเพียงแค่กลับรหัสด้านบนสำหรับคีย์หลัก ( CEP, CNPJ) และใช้งานได้ รับคำแนะนำจากเพื่อน ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.