MySQL Error 1215: ไม่สามารถเพิ่มข้อ จำกัด foreign key


336

ฉันพยายามที่จะส่งต่อสคีมาใหม่ของฉันไปยังเซิร์ฟเวอร์ db ของฉัน แต่ฉันไม่สามารถหาสาเหตุที่ฉันได้รับข้อผิดพลาดนี้ ฉันพยายามค้นหาคำตอบที่นี่ แต่ทุกสิ่งที่ฉันพบได้กล่าวว่าตั้งค่าเอ็นจิน db เป็น Innodb หรือเพื่อให้แน่ใจว่าคีย์ที่ฉันพยายามใช้เป็น foreign key เป็นคีย์หลักในตารางของตัวเอง . ฉันได้ทำสิ่งเหล่านี้ทั้งสองถ้าฉันไม่ผิด มีความช่วยเหลืออื่น ๆ ที่คุณเสนอให้อีกไหม?

Executing SQL script in server

ERROR: Error 1215: Cannot add foreign key constraint

-- -----------------------------------------------------
-- Table `Alternative_Pathways`.`Clients_has_Staff`
-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients_has_Staff` (
  `Clients_Case_Number` INT NOT NULL ,
  `Staff_Emp_ID` INT NOT NULL ,
  PRIMARY KEY (`Clients_Case_Number`, `Staff_Emp_ID`) ,
  INDEX `fk_Clients_has_Staff_Staff1_idx` (`Staff_Emp_ID` ASC) ,
  INDEX `fk_Clients_has_Staff_Clients_idx` (`Clients_Case_Number` ASC) ,
  CONSTRAINT `fk_Clients_has_Staff_Clients`
    FOREIGN KEY (`Clients_Case_Number` )
    REFERENCES `Alternative_Pathways`.`Clients` (`Case_Number` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_Clients_has_Staff_Staff1`
    FOREIGN KEY (`Staff_Emp_ID` )
    REFERENCES `Alternative_Pathways`.`Staff` (`Emp_ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

การดำเนินการสคริปต์ SQL เสร็จสิ้นแล้ว: statement: 7 สำเร็จ, 1 ล้มเหลว

นี่คือ SQL สำหรับตารางพาเรนต์

CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients` (
  `Case_Number` INT NOT NULL ,
  `First_Name` CHAR(10) NULL ,
  `Middle_Name` CHAR(10) NULL ,
  `Last_Name` CHAR(10) NULL ,
  `Address` CHAR(50) NULL ,
  `Phone_Number` INT(10) NULL ,
  PRIMARY KEY (`Case_Number`) )
ENGINE = InnoDB

CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Staff` (
  `Emp_ID` INT NOT NULL ,
  `First_Name` CHAR(10) NULL ,
  `Middle_Name` CHAR(10) NULL ,
  `Last_Name` CHAR(10) NULL ,
  PRIMARY KEY (`Emp_ID`) )
ENGINE = InnoDB

6
กรุณาโพสต์ schema สำหรับตารางแม่: และClients Staff
Ike Walker


1
@Denis อาจไม่ซ้ำกันเนื่องจาก OP บอกว่าพวกเขาได้ตรวจสอบแล้วว่าคอลัมน์เป็น PK ในตารางหลัก
Ike Walker

ฉันได้เพิ่มคำสั่ง SQL สำหรับตารางลูกค้าและพนักงานตามที่ร้องขอ
Robert B

คำตอบ:


593

ฉันคาดเดาว่าClients.Case_Numberและ / หรือStaff.Emp_IDมีชนิดข้อมูลไม่ตรงกับClients_has_Staff.Clients_Case_NumberและClients_has_Staff.Staff_Emp_IDและ

บางทีคอลัมน์ในตารางหลักคือ INT UNSIGNEDอะไร?

พวกเขาจะต้องเป็นชนิดข้อมูลเดียวกันในทั้งสองตาราง


10
ขอบคุณ สิ่งนี้กลายเป็นปัญหา Staff.Emp_ID เป็น SMALLINT ในขณะที่คอลัมน์อ้างอิงเป็น INT บางครั้งมันเป็นเรื่องเล็กน้อย ...
Robert B

Tks ในกรณีของฉันฉันได้คลิก "ZeroFill" โดยไม่ตั้งใจในคีย์ต่างประเทศในตารางลูกซึ่งหมายความว่ามันไม่ตรงกับคอลัมน์ของตารางหลัก
wwkudu

12
อาจเป็นได้ว่าชุดตัวละครนั้นแตกต่างกัน ฉันแก้ไขปัญหานี้โดยที่คอลัมน์หนึ่งมีชุดอักขระ utf8 ในขณะที่อีกคอลัมน์หนึ่งมี latin1 แก้ไขได้อย่างง่ายดายด้วย ALTER TABLE TableCHARACTER SET = utf8; และแก้ไขการเปลี่ยนแปลงตารางDeviceคอลัมน์ID ID(36) ชุดอักขระ 'utf8' ไม่ใช่ค่า NULL;
www.jensolsson.se

3
@ www.jensolsson.se คุณถูกต้องหาก PK มีคอลัมน์สตริงหนึ่งคอลัมน์ขึ้นไปพวกเขาจะต้องใช้ชุดอักขระและการเรียงตัวเดียวกัน ในกรณีเฉพาะนี้ PK คือ INT ดังนั้นชุดอักขระของตารางและ / หรือคอลัมน์จึงไม่เกี่ยวข้อง
Ike Walker

2
การเรียงเป็นปัญหาของฉัน latin1 กับ utf8 (ตรวจสอบตารางและคอลัมน์)
ben_979

244

สาเหตุที่คุณอาจได้รับข้อผิดพลาดเกี่ยวกับรหัสต่างประเทศ:

  1. คุณไม่ได้ใช้ InnoDB เป็นเอ็นจิ้นในทุกตาราง
  2. คุณกำลังพยายามอ้างอิงคีย์ที่ไม่มีอยู่บนตารางเป้าหมาย ตรวจสอบให้แน่ใจว่าเป็นกุญแจสำคัญในตารางอื่น ๆ (อาจเป็นคีย์หลักหรือคีย์เฉพาะ)
  3. ประเภทของคอลัมน์ไม่เหมือนกัน (ยกเว้นเป็นคอลัมน์ในตารางอ้างอิงสามารถเป็นโมฆะได้)
  4. หาก PK / FK เป็น varchar ตรวจสอบให้แน่ใจว่าการเปรียบเทียบนั้นเหมือนกันสำหรับทั้งคู่

ปรับปรุง:

  1. เหตุผลหนึ่งอาจเป็นเพราะคอลัมน์ที่คุณใช้ON DELETE SET NULLไม่ได้ถูกกำหนดให้เป็นโมฆะ ดังนั้นตรวจสอบให้แน่ใจว่าคอลัมน์ถูกตั้งค่าเป็นค่าเริ่มต้นเป็นโมฆะ

ตรวจสอบเหล่านี้


14
ฉันจะเพิ่มว่าถ้า FK อยู่ในคอลัมน์ตัวละครฉันคิดว่าพวกเขาจำเป็นต้องมีชุดอักขระและการเรียงชุดเดียวกัน (หรืออาจเป็น 1-byte และ 2-chteets charsets ไม่เข้ากัน)
Graham Charles

5
เหตุผลของฉันคือคุณชี้ให้เห็นหนึ่งคนแรก "เครื่องมือฐานข้อมูลที่แตกต่างกันสำหรับสองตาราง InnoDB และ MyISAM"
Randika Vishman

7
ฉันได้เหตุผลอีกข้อหนึ่ง =) `` `ON DELETE CASCADE เมื่อ UPDATE SET NULL:` `` คุณได้กำหนดเงื่อนไข SET NULL แล้วแม้ว่าบางคอลัมน์จะถูกกำหนดเป็น NOT NULL ดังนั้นฉันแค่แก้ไขคำจำกัดความของ FK
alexglue

1
ความล้มเหลวที่อาจเกิดขึ้นคือการขาดดัชนีในฟิลด์เป้าหมาย
Paul T. Rawkeen

1
ดีจุดที่สี่คือปัญหาของฉัน ช่างเป็นเรื่องที่น่ารังเกียจ - แต่ฉันมีความสุขมากที่ mysql ทำสิ่งนั้นผิดพลาด
Sebas

85

สำหรับข้อผิดพลาดอื่น ๆ ที่เหมือนกันอาจไม่ใช่เพราะคอลัมน์ไม่ตรงกันทุกประเภทคุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับข้อผิดพลาดที่สำคัญของ mysql foriegn โดยการออกคำสั่ง

SHOW ENGINE INNODB STATUS;

คุณอาจพบข้อผิดพลาดใกล้ด้านบนของข้อความที่พิมพ์คล้าย

ไม่สามารถหาดัชนีในตารางอ้างอิงที่คอลัมน์อ้างอิงปรากฏเป็นคอลัมน์แรกหรือประเภทคอลัมน์ในตารางและตารางอ้างอิงไม่ตรงกับข้อ จำกัด


13
นี่คือคำตอบที่ดีที่สุดที่ฉันคิดว่ามันช่วยในการวินิจฉัย! ขอบคุณ
alexglue

มันควรจะทำงานอย่างไร ดำเนินการค้นหาทั้งสองในแถว?
C4d

@ C4u ใช่เราควรจะดำเนินการสอบถามทั้งสองในแถวโดยมี SHOW ENGINE INNODB สถานภาพการเป็นครั้งแรกแล้วตามด้วยคำสั่งอื่น ๆ
sureshd

ทำบน PHPMyAdmin จะไม่ทำงาน ทำในพรอมต์คำสั่ง
ruwan800

13

ข้อผิดพลาด 1215 เป็นสิ่งที่น่ารำคาญ คำตอบของ Explosion Pillครอบคลุมพื้นฐาน คุณต้องการให้แน่ใจว่าจะเริ่มจากที่นั่น อย่างไรก็ตามมีอีกหลายกรณีที่ละเอียดกว่าที่ควรระวัง:

ตัวอย่างเช่นเมื่อคุณพยายามเชื่อมโยงคีย์หลักของตารางที่แตกต่างกันตรวจสอบให้แน่ใจว่ามีตัวเลือกที่เหมาะสมON UPDATEและเหมาะสม ON DELETEเช่น:

...
PRIMARY KEY (`id`),
FOREIGN KEY (`id`) REFERENCES `t` (`other_id`) ON DELETE SET NULL
....

จะไม่บินเพราะคีย์หลัก (เช่นid) ไม่สามารถทำได้NULLไม่สามารถ

ฉันแน่ใจว่ามีปัญหาที่ลึกซึ้งยิ่งขึ้นในทำนองเดียวกันเมื่อเพิ่มข้อ จำกัด เหล่านี้ซึ่งเป็นสาเหตุที่เมื่อพบข้อผิดพลาดของข้อ จำกัด ตรวจสอบให้แน่ใจเสมอว่าข้อ จำกัด และความหมายของพวกเขานั้นสมเหตุสมผลในบริบทปัจจุบันของคุณ ขอให้โชคดีกับข้อผิดพลาด 1215 ของคุณ!


1
คุณจะได้รับข้อผิดพลาดนี้หากคุณพยายามลบคีย์ต่างประเทศที่ไม่มี :)
Explosion Pills

2
นอกจากนี้จากเอกสาร: MySQL ต้องการดัชนีในคีย์ต่างประเทศและคีย์อ้างอิงเพื่อให้การตรวจสอบคีย์ต่างประเทศนั้นรวดเร็วและไม่ต้องใช้การสแกนตาราง ในตารางอ้างอิงจะต้องมีดัชนีที่คอลัมน์ต่างประเทศที่สำคัญมีการระบุไว้เป็นคอลัมน์แรกในลำดับเดียวกัน ดัชนีดังกล่าวจะถูกสร้างขึ้นในตารางอ้างอิงโดยอัตโนมัติหากไม่มีอยู่ ดัชนีนี้อาจถูกลดลงอย่างเงียบ ๆ ในภายหลังหากคุณสร้างดัชนีอื่นที่สามารถใช้เพื่อบังคับใช้ข้อ จำกัด foreign key ถ้าได้รับ index_name จะถูกใช้ตามที่อธิบายไว้ก่อนหน้านี้
Jonathan M

1
นั่นเป็นเหตุผลที่ผมมาที่นี่: ฉันพยายามที่จะสร้างคีย์ต่างประเทศในคอลัมน์ฉันอยากจะเป็นON DELETE SET NULL NOT NULLสมมติว่าคุณไม่มีเค้กและกินมันด้วย
Martin Hennings

8

ตรวจสอบการเรียงตารางโดยใช้SHOW TABLE STATUSคุณสามารถตรวจสอบข้อมูลเกี่ยวกับตารางรวมถึงการเปรียบเทียบ

ตารางทั้งสองจะต้องมีการเปรียบเทียบที่เหมือนกัน

มันเกิดขึ้นกับฉัน


นี่เป็นปัญหาในกรณีของฉัน - ข้อผิดพลาด MySQL ไม่เป็นประโยชน์เลย!
Juddling

7

ในกรณีของฉันฉันได้ลบตารางใช้SET FOREIGN_KEY_CHECKS=0แล้วSET FOREIGN_KEY_CHECKS=1หลังจาก error 1215เมื่อผมไปโหลดตารางผมได้ ปัญหาคือมีตารางอื่นในฐานข้อมูลที่มี foreign key ไปยังตารางที่ฉันลบและกำลังโหลดใหม่ ส่วนหนึ่งของกระบวนการโหลดซ้ำเกี่ยวข้องกับการเปลี่ยนชนิดข้อมูลสำหรับหนึ่งในฟิลด์ซึ่งทำให้ foreign key จากตารางอื่นไม่ถูกต้องซึ่งทำให้เกิดการเรียกerror 1215ใช้ ฉันแก้ไขปัญหาโดยการวางแล้วโหลดตารางอีกครั้งด้วยชนิดข้อมูลใหม่สำหรับเขตข้อมูลที่เกี่ยวข้อง


5

ฉันได้รับข้อผิดพลาดเดียวกันขณะพยายามเพิ่ม fk ในกรณีของฉันปัญหาเกิดจากการ PK ของตาราง FK ซึ่งถูกทำเครื่องหมายว่าไม่ได้ลงนาม


5

มีข้อผิดพลาดที่ฉันเคยพบกับ "ข้อผิดพลาด 1215: ไม่สามารถเพิ่มข้อ จำกัด คีย์ต่างประเทศ" เมื่อใช้ Laravel 4 โดยเฉพาะกับตัวสร้าง Laravel 4 ของ JeffreyWay

ใน Laravel 4 คุณสามารถใช้ Generators ของ JeffreyWay เพื่อสร้างไฟล์การย้ายข้อมูลเพื่อสร้างตารางแบบหนึ่งต่อหนึ่งซึ่งหมายความว่าแต่ละไฟล์การย้ายข้อมูลจะสร้างตารางหนึ่งตาราง คุณต้องตระหนักถึงความจริงที่ว่าแต่ละไฟล์การโยกย้ายถูกสร้างขึ้นด้วยการประทับเวลาในชื่อไฟล์ซึ่งจะทำให้การสั่งซื้อไฟล์ ลำดับของการสร้างเป็นลำดับของการดำเนินการย้ายข้อมูลเมื่อคุณใช้คำสั่ง Artisan CLI "php artisan migrate" ดังนั้นหากไฟล์ถามถึงข้อ จำกัด ของ foreign key ที่อ้างถึงคีย์ซึ่งจะเป็น แต่ยังไม่ได้สร้างในไฟล์หลังจะมีการเรียกใช้ Error 1215 ในกรณีเช่นนี้สิ่งที่คุณต้องทำคือปรับลำดับการสร้างไฟล์การโยกย้าย สร้างไฟล์ใหม่ตามลำดับที่ถูกต้องคัดลอกเนื้อหาแล้วลบไฟล์เก่าที่ไม่เป็นระเบียบ


3

ฉันมีปัญหาเดียวกันทางออกของฉัน:

ก่อน:

CREATE TABLE EMPRES
( NoFilm smallint NOT NULL

  PRIMARY KEY (NoFilm)

  FOREIGN KEY (NoFilm) REFERENCES cassettes

);

สารละลาย:

CREATE TABLE EMPRES
(NoFilm smallint NOT NULL REFERENCES cassettes,

 PRIMARY KEY (NoFilm)

);

ฉันหวังว่ามันจะช่วย;)


1
คุณลืมเครื่องหมายจุลภาคสองสามตัวใน CREATE แรกของคุณ
DLight

3

ผมมีปัญหาเหมือนกัน.
ฉันแก้ไขมันทำสิ่งนี้:

ฉันสร้างบรรทัดต่อไปนี้ใน
primary key: (id int(11) unsigned NOT NULL AUTO_INCREMENT)

ฉันพบโซลูชันนี้หลังจากพยายามนำเข้าตารางในตัวสร้างสคีมาของฉัน ถ้ามันเหมาะกับคุณบอกให้ฉันรู้!

โชคดี!

Felipe Tércio


3

ฉันแค่อยากจะเพิ่มกรณีนี้เช่นกันสำหรับVARCHARความสัมพันธ์ที่สำคัญต่างประเทศ ฉันใช้เวลาสัปดาห์ที่ผ่านมาพยายามคิดออกใน MySQL Workbench 8.0 และในที่สุดก็สามารถแก้ไขข้อผิดพลาด

คำตอบสั้น ๆ : ชุดอักขระและการเปรียบเทียบของ schema, ตาราง, คอลัมน์, ตารางการอ้างอิง, คอลัมน์การอ้างอิงและตารางอื่น ๆ ที่อ้างอิงถึงตารางหลักจะต้องตรงกัน

คำตอบยาว: ฉันมีประเภทข้อมูล ENUM ในตารางของฉัน ฉันเปลี่ยนสิ่งนี้เป็นVARCHARและฉันสามารถรับค่าจากตารางอ้างอิงเพื่อที่ฉันไม่ต้องแก้ไขตารางหลักเพื่อเพิ่มตัวเลือกเพิ่มเติม ความสัมพันธ์ที่เป็นกุญแจต่างประเทศนี้ดูเหมือนตรงไปตรงมา แต่ฉันได้รับข้อผิดพลาด 1215 คำตอบของarvindและลิงค์ต่อไปนี้แนะนำให้ใช้

SHOW ENGINE INNODB STATUS;

ในการใช้คำสั่งนี้ฉันได้รับคำอธิบาย verbose ต่อไปนี้สำหรับข้อผิดพลาดโดยไม่มีข้อมูลที่เป็นประโยชน์เพิ่มเติม

ไม่สามารถหาดัชนีในตารางอ้างอิงที่คอลัมน์อ้างอิงปรากฏเป็นคอลัมน์แรกหรือประเภทคอลัมน์ในตารางและตารางอ้างอิงไม่ตรงกับข้อ จำกัด โปรดทราบว่าประเภทหน่วยเก็บข้อมูลภายในของ ENUM และ SET เปลี่ยนไปในตารางที่สร้างด้วย> = InnoDB-4.1.12 และคอลัมน์ดังกล่าวในตารางเก่าไม่สามารถอ้างอิงได้โดยคอลัมน์ดังกล่าวในตารางใหม่ โปรดอ้างอิงถึงhttp://dev.mysql.com/doc/refman/8.0/en/innodb-foreign-key-constraints.htmlสำหรับการกำหนดคีย์ต่างประเทศที่ถูกต้อง

หลังจากนั้นฉันใช้SET FOREIGN_KEY_CHECKS=0;ตามที่แนะนำโดยArvind Bharadwajและลิงค์ที่นี่ :

สิ่งนี้ทำให้ข้อความแสดงข้อผิดพลาดต่อไปนี้:

รหัสข้อผิดพลาด: 1822 ไม่สามารถเพิ่มข้อ จำกัด กุญแจต่างประเทศ ดัชนีที่ขาดหายไปสำหรับข้อ จำกัด

ณ จุดนี้ฉัน 'reverse engineer'-ed schema และฉันสามารถสร้างความสัมพันธ์กับ foreign-key ในแผนภาพ EER ใน 'ส่งต่อวิศวกร' ฉันพบข้อผิดพลาดต่อไปนี้:

ข้อผิดพลาด 1452: ไม่สามารถเพิ่มหรืออัปเดตแถวลูกได้: ข้อ จำกัด รหัสต่างประเทศล้มเหลว

เมื่อฉัน 'ส่งต่อวิศวกร' -ed ไดอะแกรม EER ไปยังสคีมาใหม่สคริปต์ SQL จะทำงานโดยไม่มีปัญหา ในการเปรียบเทียบ SQL ที่สร้างขึ้นจากความพยายามในการส่งต่อวิศวกรฉันพบว่าความแตกต่างคือชุดอักขระและการเรียง ตารางหลักตารางลูกและคอลัมน์ทั้งสองมีutf8mb4ชุดอักขระและการutf8mb4_0900_ai_ciเรียงอย่างไรก็ตามคอลัมน์อื่นในตารางหลักถูกอ้างอิงโดยใช้CHARACTER SET = utf8 , COLLATE = utf8_bin ;ตารางลูกที่แตกต่างกัน

สำหรับ schema ทั้งหมดฉันเปลี่ยนชุดอักขระและการเรียงสำหรับตารางทั้งหมดและคอลัมน์ทั้งหมดเป็นต่อไปนี้:

CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;

ในที่สุดก็แก้ปัญหาของฉันด้วยข้อผิดพลาด 1215

หมายเหตุด้านข้าง: การเปรียบเทียบutf8mb4_general_ciทำงานใน MySQL Workbench 5.0 หรือใหม่กว่า Collation ใช้utf8mb4_0900_ai_ciงานได้กับ MySQL Workbench 8.0 หรือสูงกว่าเท่านั้น ฉันเชื่อว่าหนึ่งในเหตุผลที่ฉันมีปัญหาเกี่ยวกับชุดอักขระและการเปรียบเทียบคือเนื่องจาก MySQL Workbench อัปเกรดเป็น 8.0 ในระหว่างนั้น นี่คือลิงค์ที่พูดถึงเพิ่มเติมเกี่ยวกับการเปรียบเทียบนี้


2

ฉันหาข้อผิดพลาดนี้ไม่พบ

CREATE TABLE RATING (

Riv_Id INT(5),
Mov_Id INT(10) DEFAULT 0,
Stars INT(5),
Rating_date DATE, 

PRIMARY KEY (Riv_Id, Mov_Id),

FOREIGN KEY (Riv_Id) REFERENCES REVIEWER(Reviewer_ID)
ON DELETE SET NULL ON UPDATE CASCADE,

FOREIGN KEY (Mov_Id) REFERENCES MOVIE(Movie_ID)
ON DELETE SET DEFAULT ON UPDATE CASCADE
)

2

สิ่งนี้จะเกิดขึ้นเมื่อชนิดของคอลัมน์ไม่เหมือนกัน

เช่นถ้าคอลัมน์ที่คุณอ้างถึงเป็น UNSIGNED INT และคอลัมน์ที่อ้างอิงคือ INT คุณจะได้รับข้อผิดพลาดนี้


2

สำหรับ MySQL (INNODB) ... รับนิยามสำหรับคอลัมน์ที่คุณต้องการเชื่อมโยง

SELECT * FROM information_schema.columns WHERE 
TABLE_NAME IN (tb_name','referenced_table_name') AND 
COLUMN_NAME  IN ('col_name','referenced_col_name')\G

เปรียบเทียบและตรวจสอบความหมายของคอลัมน์ทั้งสองได้

COLUMN_TYPE เดียวกัน (ความยาว), COLATION เดียวกัน

อาจเป็นประโยชน์ในการเล่นเช่น

set foreign_key_checks=0;
ALTER TABLE tb_name ADD FOREIGN KEY(col_name) REFERENCES ref_table(ref_column) ON DELETE ...
set foreign_key_checks=1;

2

ตรวจสอบความเข้ากันได้ของตาราง ตัวอย่างเช่นหากมีตารางหนึ่งและอีกตารางMyISAMหนึ่งInnoDBคุณอาจมีปัญหานี้


2

เหตุผลอื่น: หากคุณใช้คอลัมน์ON DELETE SET NULL ทั้งหมดที่ใช้ในคีย์ภายนอกต้องอนุญาตให้มีค่า Null มีคนอื่นพบสิ่งนี้ในคำถามนี้นี้

จากความเข้าใจของฉันมันจะไม่เป็นปัญหาเกี่ยวกับความถูกต้องของข้อมูล แต่ดูเหมือนว่า MySQL ไม่รองรับคุณสมบัตินี้ (ใน 5.7)


1

เมื่อข้อผิดพลาดนี้เกิดขึ้นเนื่องจากตารางที่อ้างถึงใช้กลไก MyISAM คำตอบนี้ให้วิธีที่รวดเร็วในการแปลงฐานข้อมูลของคุณเพื่อให้ตารางรุ่น Django ทั้งหมดใช้ InnoDB: https://stackoverflow.com/a/15389961/2950621

มันเป็นคำสั่งการจัดการ Django ที่เรียกว่า convert_to_innodb


1

Wooo ฉันเพิ่งได้รับมัน! มันเป็นการผสมผสานของคำตอบที่โพสต์ไว้มากมาย (innoDB, unsigned, etc) สิ่งหนึ่งที่ฉันไม่เห็นที่นี่คือ: ถ้า FK ของคุณชี้ไปที่ PK ตรวจสอบให้แน่ใจว่าคอลัมน์ต้นฉบับมีค่าที่สมเหตุสมผล ตัวอย่างเช่นถ้า PK เป็นสื่อ (8) ตรวจสอบให้แน่ใจว่าคอลัมน์แหล่งข้อมูลนั้นมีสื่อโฆษณา (8) ด้วย นั่นเป็นส่วนหนึ่งของปัญหาสำหรับฉัน


1

สำหรับฉันมันเป็นประเภทคอลัมน์ BigINT! = INT

แต่มันก็ยังไม่ทำงาน

ดังนั้นฉันตรวจสอบเครื่องยนต์ ตรวจสอบให้แน่ใจว่า Table1 = InnoDB และ Table = InnoDB


1

ฉันพบข้อผิดพลาดนี้ด้วยเหตุผลที่แตกต่างอย่างสิ้นเชิง ฉันใช้ MySQL Workbench 6.3 เพื่อสร้างตัวแบบข้อมูลของฉัน (เครื่องมือที่ยอดเยี่ยม) ฉันสังเกตเห็นว่าเมื่อลำดับคอลัมน์ที่กำหนดไว้ในนิยามข้อ จำกัด Foreign Key นั้นไม่สอดคล้องกับลำดับคอลัมน์ตารางข้อผิดพลาดนี้ก็จะถูกสร้างขึ้นเช่นกัน

ฉันใช้เวลาลองอย่างอื่นประมาณ 4 ชั่วโมง แต่ลองตรวจสอบดู

ตอนนี้ทุกอย่างทำงานได้ดีและฉันสามารถกลับไปเขียนโค้ดได้ :-)


คุณหมายถึงอะไร?
Yazan Jaber

2
@YazanJaber ฉันคิดว่าเขาหมายถึงสิ่งนี้ : InnoDB อนุญาตให้ใช้ foreign key เพื่ออ้างอิงคอลัมน์ดัชนีหรือกลุ่มคอลัมน์ใด ๆ อย่างไรก็ตามในตารางที่อ้างอิงจะต้องมีดัชนีที่คอลัมน์อ้างอิงถูกแสดงเป็นคอลัมน์แรกในลำดับเดียวกัน
robsch

1

เมื่อพยายามที่จะทำให้ต่างประเทศที่สำคัญเมื่อใช้การโยกย้าย laravel

ชอบตัวอย่างนี้

ตารางผู้ใช้

    public function up()
{
    Schema::create('flights', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->TinyInteger('color_id')->unsigned();
        $table->foreign('color_id')->references('id')->on('colors');
        $table->timestamps();
    });
}

ตารางสี

    public function up()
{
    Schema::create('flights', function (Blueprint $table) {
        $table->increments('id');
        $table->string('color');
        $table->timestamps();
    });
}

บางครั้งคุณสมบัติไม่ทำงาน

[PDOException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

ข้อผิดพลาดนี้เกิดขึ้นเนื่องจากคีย์ต่างประเทศ (ประเภท) ใน [ตารางผู้ใช้] จะเลื่อนจากคีย์หลัก (ประเภท) ใน [ตารางสี]

ในการแก้ปัญหานี้ควรเปลี่ยนคีย์หลักใน [ตารางสี]

$table->tinyIncrements('id');


เมื่อคุณใช้คีย์หลัก $table->Increments('id');

คุณควรใช้Integerเป็นรหัสต่างประเทศ

    $table-> unsignedInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

เมื่อคุณใช้คีย์หลัก $table->tinyIncrements('id');

คุณควรใช้unsignedTinyIntegerเป็นรหัสต่างประเทศ

    $table-> unsignedTinyInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

เมื่อคุณใช้คีย์หลัก $table->smallIncrements('id');

คุณควรใช้unsignedSmallIntegerเป็นรหัสต่างประเทศ

    $table-> unsignedSmallInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

เมื่อคุณใช้คีย์หลัก $table->mediumIncrements('id');

คุณควรใช้unsignedMediumIntegerเป็นรหัสต่างประเทศ

    $table-> unsignedMediumInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

สิ่งนี้ช่วยฉัน ฉันมีbigIncrementsคีย์หลักดังนั้นฉันต้องใช้unsignedBigInteger
jagad89

1

ในกรณีของฉันฉันต้องปิดการFOREIGN KEYตรวจสอบเนื่องจากไม่มีตารางต้นฉบับ

SET FOREIGN_KEY_CHECKS=0;


0

ระวังการใช้ backquotes ด้วย ฉันมีสคริปต์ในคำสั่งต่อไปนี้

ALTER TABLE service ADD FOREIGN KEY (create_by) REFERENCES `system_user(id)`;

แต่ backquotes ในตอนท้ายเป็นเท็จ มันควรจะเป็น:

ALTER TABLE service ADD FOREIGN KEY (create_by) REFERENCES `system_user`(`id`);

MySQL ไม่มีรายละเอียดเกี่ยวกับข้อผิดพลาดนี้ ...


0

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


0

ฉันรู้ว่าฉันมาช้าไปงานปาร์ตี้ แต่ฉันต้องการที่จะนำมันออกจากที่นี่เพื่อให้มันอยู่ในรายการ

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

หากคุณไม่แน่ใจให้สำรองข้อมูลตารางที่มี Foreign Key ลบข้อมูลทั้งหมดแล้วลองสร้าง Foreign Key หากประสบความสำเร็จคุณจะต้องทำอะไร!

โชคดี.


0

นี่เป็นรุ่นที่ละเอียดอ่อนของสิ่งที่พูดไปแล้ว แต่ในกรณีของฉันฉันมี 2 ฐานข้อมูล (foo and bar) ฉันสร้าง foo ขึ้นมาก่อนและฉันก็ไม่รู้ว่ามันอ้างถึงคีย์ต่างประเทศใน bar.baz (ซึ่งยังไม่ได้สร้าง) เมื่อฉันพยายามสร้าง bar.baz (ไม่มีคีย์ต่างประเทศ) ฉันได้รับข้อผิดพลาดนี้ หลังจากดูไปซักพักฉันก็พบว่ามีกุญแจต่างประเทศอยู่ด้วย

เรื่องสั้นสั้น ๆ หากคุณได้รับข้อผิดพลาดนี้คุณอาจมีคีย์ต่างประเทศที่มีอยู่แล้วในตารางที่กำลังสร้าง


0

สำหรับฉันข้อผิดพลาด 1215 นั้นเกิดขึ้นเมื่อฉันนำเข้า dumpfile ที่สร้างขึ้นโดยmysqldumpสร้างตารางตามลำดับตัวอักษรซึ่งในกรณีของฉันทำให้เกิด foreign key ไปยังตารางอ้างอิงที่สร้างขึ้นในภายหลังในไฟล์ (อุปกรณ์ประกอบฉากไปที่หน้านี้เพื่อชี้ให้เห็น: https://www.percona.com/blog/2017/04/06/dealing-mysql-error-code-1215-cannot-add-foreign-key-constraint/ )

เนื่องจาก mysqldump สั่งซื้อตารางตามลำดับตัวอักษรและฉันไม่ต้องการเปลี่ยนชื่อของตารางฉันจึงปฏิบัติตามคำแนะนำในคำตอบโดย JeremyWeir ในหน้านี้ซึ่งระบุว่าจะใส่set FOREIGN_KEY_CHECKS = 0;ที่ด้านบนของไฟล์การถ่ายโอนและวางSET FOREIGN_KEY_CHECKS = 1;ที่ด้านล่างของไฟล์การถ่ายโอน .

ทางออกนั้นใช้ได้สำหรับฉัน


0

ดังนั้นฉันจึงลองแก้ไขทั้งหมดข้างต้นและไม่มีโชค ฉันอาจจะหายไปข้อผิดพลาดในตารางของฉัน - ไม่สามารถหาสาเหตุและฉันได้รับข้อผิดพลาด 1215 ดังนั้นฉันจึงใช้การแก้ไขนี้

ในสภาพแวดล้อมท้องถิ่นของฉันใน phpMyAdmin ฉันส่งออกข้อมูลจากตารางที่เป็นปัญหา ฉันเลือกรูปแบบ CSV ในขณะที่ยังอยู่ใน phpMyAdmin เมื่อเลือกตารางฉันเลือก "More-> Options" ที่นี่ฉันเลื่อนลงไปที่ "คัดลอกตารางไปที่ (ฐานข้อมูล. ตาราง) เลือก" โครงสร้างเท่านั้น "เปลี่ยนชื่อบางสิ่งในตารางหรืออาจแค่เพิ่มคำว่า" คัดลอก "ถัดจากชื่อตารางปัจจุบันคลิก" ไป "สิ่งนี้จะสร้างใหม่ ตารางส่งออกตารางใหม่และนำเข้าไปยังเซิร์ฟเวอร์ใหม่หรืออื่น ๆ ฉันใช้ phpMyAdmin ที่นี่เช่นกันเมื่อนำเข้าแล้วเปลี่ยนชื่อของตารางกลับเป็นชื่อเดิมเลือกตารางใหม่เลือกการนำเข้าสำหรับรูปแบบเลือก CSV . ยกเลิกการเลือก "เปิดใช้งานการตรวจสอบคีย์ต่างประเทศ" เลือก "ไป" จนถึงทุกอย่างก็ใช้งานได้ดี

ผมโพสต์แก้ไขของฉันบนของบล็อก


-1

แม้ว่าฉันจะมีปัญหาเดียวกัน และความผิดนั้นก็คือเครื่องหมาย "ไม่ได้ลงนาม" ในตาราง PK ของ FK


-6

ฉันมีข้อผิดพลาดเดียวกันครั้งเดียว ฉันเพิ่งรีสตาร์ทเซิร์ฟเวอร์ MySQL และแก้ไขปัญหา


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