เพิ่ม Foreign Key ไปยังตารางที่มีอยู่


324

ฉันต้องการเพิ่ม Foreign Key ไปยังตารางชื่อ "katalog"

ALTER TABLE katalog 
ADD CONSTRAINT `fk_katalog_sprache` 
FOREIGN KEY (`Sprache`)
REFERENCES `Sprache` (`ID`)
ON DELETE SET NULL
ON UPDATE SET NULL;

เมื่อฉันพยายามทำสิ่งนี้ฉันได้รับข้อความแสดงข้อผิดพลาดนี้:

Error Code: 1005. Can't create table 'mytable.#sql-7fb1_7d3a' (errno: 150)

ข้อผิดพลาดในสถานะ INNODB:

120405 14:02:57 ข้อผิดพลาดในข้อ จำกัด foreign key ของ table mytable # sql-7fb1_7d3a:

FOREIGN KEY (`Sprache`)
REFERENCES `Sprache` (`ID`)
ON DELETE SET NULL
ON UPDATE SET NULL:
Cannot resolve table name close to:
(`ID`)
ON DELETE SET NULL
ON UPDATE SET NULL

เมื่อฉันใช้คิวรีนี้มันใช้งานได้ แต่มีการกระทำที่ "ผิดชอบ":

ALTER TABLE `katalog` 
ADD FOREIGN KEY (`Sprache` ) REFERENCES `sprache` (`ID` )

ตารางทั้งสองเป็น InnoDB และทั้งสองฟิลด์เป็น "INT (11) ไม่ใช่ null" ฉันใช้ MySQL 5.1.61 กำลังพยายามยิง ALTER Query นี้ด้วย MySQL Workbench (ใหม่ที่สุด) บน MacBook Pro

ตารางสร้างข้อความสั่ง:

CREATE TABLE `katalog` (
`ID` int(11) unsigned NOT NULL AUTO_INCREMENT,
`Name` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
`AnzahlSeiten` int(4) unsigned NOT NULL,
`Sprache` int(11) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `katalogname_uq` (`Name`)
 ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=DYNAMIC$$

CREATE TABLE `sprache` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
 `Bezeichnung` varchar(45) NOT NULL,
 PRIMARY KEY (`ID`),
 UNIQUE KEY `Bezeichnung_UNIQUE` (`Bezeichnung`),
KEY `ix_sprache_id` (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8

1
เนื่องจากคุณไม่ได้โพสต์เอาท์พุทของSHOW CREATE TABLEฉันสามารถ แต่ถาม - เป็นชื่อคอลัมน์จริงๆ ID ตัวพิมพ์ใหญ่?
NB

ดีก็ง่ายต่อการจุดตอนนี้ - ได้katalog ไม่มีส่วนดังนั้นสองคอลัมน์จึงไม่เหมือนกัน int(11) unsignedspracheusigned
NB

คุณหมายถึงว่าเขตข้อมูลหลักทั้งสองต้องเป็นประเภทข้อมูลเดียวกันหรือไม่
frgtv10

2
นี่เป็นปัญหาของการออกแบบของคุณ: ก่อนอื่นคุณอ้างอิงสองauto_incrementคอลัมน์ที่ไม่ดี นอกจากนี้ยังมีคู่มือ MySQL Corresponding columns in the foreign key and the referenced key must have similar internal data types inside InnoDB so that they can be compared without a type conversion. The size and sign of integer types must be the same. The length of string types need not be the same. For nonbinary (character) string columns, the character set and collation must be the same.กล่าวว่า: ดังนั้นใช่ประเภทข้อมูลที่คล้ายกันและเครื่องหมายเดียวกัน
NB

2
ฉันไม่ได้อ้างอิงฟิลด์ auto_increment สองฟิลด์ katalog.Sprache (ไม่ใช่อัตโนมัติ) -> sprache.ID (อัตโนมัติ)
frgtv10

คำตอบ:


560

ในการเพิ่ม foreign key (grade_id) ลงในตารางที่มีอยู่ (ผู้ใช้) ให้ทำตามขั้นตอนต่อไปนี้:

ALTER TABLE users ADD grade_id SMALLINT UNSIGNED NOT NULL DEFAULT 0;
ALTER TABLE users ADD CONSTRAINT fk_grade_id FOREIGN KEY (grade_id) REFERENCES grades(id);

12
เหตุผลช่วยให้ฉันเข้าใจและจดจำ นี่เป็นเพราะคุณไม่สามารถเพิ่ม foreign key ไปยังเขตข้อมูลที่ไม่ได้ลงนามใช่ไหม?
PixMach

8
@PixMach คำตอบคือไม่ คุณสามารถลงชื่อเป็นจำนวนเต็มเป็นคีย์ต่างประเทศได้ ดังที่หมายเหตุไว้ในคำถามประเภทและเครื่องหมายของฟิลด์ต้องตรงกัน ดังนั้นหากคีย์หลักของคุณในตารางการค้นหาไม่ได้ลงนามดังนั้นเขตข้อมูลที่สำคัญต่างประเทศจะต้องไม่ได้ลงนาม ถ้าเขตข้อมูลคีย์หลักถูกลงนามแล้วเขตข้อมูลที่สำคัญต่างประเทศจะต้องลงนาม ลองใช้วิธีนี้: ไม่ว่าคอลัมน์ในตารางใดจะถูกกำหนดไว้ใน SHOW CREATE TABLE มันต้องมีคำจำกัดความเดียวกันในตารางอื่น
Ben Keene

1
โปรดทราบว่าสิ่งนี้สามารถทำได้ด้วยการสืบค้นเพียงครั้งเดียว (อาจจะดีกว่าในกรณีที่เกิดความล้มเหลว ฯลฯ )
Stijn de Witt

6
ฉันต้องเรียกใช้ "SET FOREIGN_KEY_CHECKS = 0;" ก่อนเรียกใช้คำสั่ง ADD CONSTRAINT หรือ SQL จะบ่นว่า "ไม่สามารถเพิ่มหรืออัปเดตแถวลูกได้: ข้อ จำกัด ของรหัสต่างประเทศล้มเหลว"
Erin Geyer

2
ไม่ได้เพียงแค่ใช้ "FOREIGN_KEY_CHECKS SET = 0;" หากคุณได้รับข้อผิดพลาด "ข้อ จำกัด ของรหัสต่างประเทศล้มเหลว" คุณจะเห็นได้ชัดว่ามีข้อมูลไม่ดีที่คุณต้องแก้ไขมิฉะนั้นคุณจะได้รับปัญหาที่ใหญ่กว่าในบรรทัด
MazeChaZer

72

เพียงใช้แบบสอบถามนี้ฉันได้ลองตามสถานการณ์และใช้งานได้ดี

ALTER TABLE katalog ADD FOREIGN KEY (`Sprache`) REFERENCES Sprache(`ID`);


15

ตรวจสอบลิงค์นี้ มันช่วยฉันด้วย errno 150: http://verysimple.com/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/

ด้านบนของหัวของฉันสองสิ่งที่อยู่ในใจ

  • ดัชนีคีย์ต่างประเทศของคุณเป็นชื่อเฉพาะในฐานข้อมูลทั้งหมด (# 3 ในรายการ) หรือไม่
  • คุณกำลังพยายามตั้งค่าตาราง PK เป็น NULL ในการอัปเดต (# 5 ในรายการ) หรือไม่

ฉันคาดเดาว่าปัญหานี้เกิดจากการตั้งค่า NULL ในการอัปเดต (ถ้าสมองของฉันไม่ได้ย้อนหลังวันนี้

แก้ไข: ฉันพลาดความคิดเห็นในโพสต์ต้นฉบับของคุณ คอลัมน์ int ที่ไม่ได้ลงชื่อ / ไม่ได้ลงนามอาจแก้ไขกรณีของคุณ หวังว่าลิงก์ของฉันจะช่วยให้ใครบางคนในอนาคตคิด


13
FOREIGN KEY (`Sprache`)
REFERENCES `Sprache` (`ID`)
ON DELETE SET NULL
ON UPDATE SET NULL;

แต่ตารางของคุณมี:

CREATE TABLE `katalog` (
`Sprache` int(11) NOT NULL,

มันลาดเทตั้งคอลัมน์ Sprache ที่จะเป็นโมฆะเพราะมันถูกกำหนดให้เป็นไม่เป็นโมฆะ


5

MySQL จะดำเนินการค้นหานี้:

ALTER TABLE `db`.`table1`
ADD COLUMN `col_table2_fk` INT UNSIGNED NULL,
ADD INDEX `col_table2_fk_idx` (`col_table2_fk` ASC),
ADD CONSTRAINT `col_table2_fk1`
FOREIGN KEY (`col_table2_fk`)
REFERENCES `db`.`table2` (`table2_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

ไชโย!


5

วิธีแก้ไข Error Code: 1005. Can't create table 'mytable.#sql-7fb1_7d3a' (errno: 150) in mysql.

  1. ปรับเปลี่ยนตารางของคุณและเพิ่มดัชนีลงไป ..

    ALTER TABLE users ADD INDEX index_name (index_column)
  2. ตอนนี้เพิ่มข้อ จำกัด

    ALTER TABLE foreign_key_table
    ADD CONSTRAINT foreign_key_name FOREIGN KEY (foreign_key_column)
    REFERENCES primary_key_table (primary_key_column) ON DELETE NO ACTION
    ON UPDATE CASCADE;

หมายเหตุถ้าคุณไม่เพิ่มดัชนีมันจะไม่ทำงาน

หลังจากต่อสู้กับมันประมาณ 6 ชั่วโมงฉันก็คิดวิธีแก้ปัญหาฉันหวังว่านี่จะช่วยชีวิต


4

เมื่อคุณเพิ่มข้อ จำกัด foreign key ให้กับตารางโดยใช้ ALTER TABLE อย่าลืมสร้างดัชนีที่จำเป็นก่อน

  1. สร้างดัชนี
  2. แก้ไขตาราง

ฉันสร้างดัชนีสำหรับทั้งคู่ เมื่อฉันพยายามเรียกใช้ฉันได้รับข้อความแสดงข้อผิดพลาดเหมือนเดิม เมื่อฉันปฏิเสธส่วน "ในการลบในการปรับปรุง" มันทำงานได้ แต่ผิด "กับการลบ" การกระทำ;)
frgtv10

@ frgtv10 เป็นไปได้มากว่าข้อมูลในตารางขัดแย้งกับ "เมื่อลบ"
Maksym Polshcha

3

ลองทั้งหมดในแบบสอบถามเดียว

  ALTER TABLE users ADD grade_id SMALLINT UNSIGNED NOT NULL DEFAULT 0,
      ADD CONSTRAINT fk_grade_id FOREIGN KEY (grade_id) REFERENCES grades(id);

0

สิ่งนี้เกิดขึ้นเพราะตารางของคุณอยู่ในชุดอักขระที่แตกต่างกันสองชุด เป็นตัวอย่างหนึ่งตารางที่สร้างใน charset = utf-8 และตารางอื่น ๆ ถูกสร้างขึ้นใน CHARSET = latin1 ดังนั้นคุณจึงต้องการเพิ่มคีย์ foriegn ลงในตารางเหล่านี้ได้ ใช้ชุดอักขระเดียวกันในทั้งสองตารางจากนั้นคุณจะสามารถเพิ่มคีย์ foriegn ได้ ข้อผิดพลาด 1005 foriegn key constraint ที่เกิดขึ้นไม่ถูกต้องสามารถแก้ไขได้จากสิ่งนี้


0

ฉันเจอปัญหาเดียวกัน ฉันกรณีของฉันตารางมีข้อมูลอยู่แล้วและมีคีย์ในตารางนี้ที่ไม่ปรากฏในตารางอ้างอิง ดังนั้นฉันต้องลบแถวนี้ที่ไม่เคารพข้อ จำกัด และทุกอย่างทำงานได้


0

ขั้นตอนที่ 1: เรียกใช้สคริปต์นี้

SET FOREIGN_KEY_CHECKS=0;

ขั้นตอนที่ 2: เพิ่มคอลัมน์

ALTER TABLE mileage_unit ADD COLUMN COMPANY_ID BIGINT(20) NOT NULL

ขั้นตอนที่ 3: เพิ่มกุญแจต่างประเทศไปยังคอลัมน์เพิ่ม

ALTER TABLE mileage_unit
ADD FOREIGN KEY (COMPANY_ID) REFERENCES company_mst(COMPANY_ID);

ขั้นตอนที่ 4: เรียกใช้สคริปต์นี้

SET FOREIGN_KEY_CHECKS=1;

-1
 ALTER TABLE TABLENAME ADD FOREIGN KEY (Column Name) REFERENCES TableName(column name)

ตัวอย่าง:-

ALTER TABLE Department ADD FOREIGN KEY (EmployeeId) REFERENCES Employee(EmployeeId)

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