如果你在使用MySQL數據庫時增加外鍵老是不成功,可能出現某些常見的問題。下面我們逐一進行分析。
1. 數據類型不匹配
創建表: CREATE TABLE tb_student ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, age TINYINT UNSIGNED NOT NULL, sex ENUM('男', '女') NOT NULL, grade_id TINYINT UNSIGNED NOT NULL ); 創建外鍵: ALTER TABLE tb_student ADD CONSTRAINT fk_student_grade_id FOREIGN KEY (grade_id) REFERENCES tb_grade(id);
以上代碼拋出的錯誤信息為:ERROR 1215 (HY000): Cannot add foreign key constraint
這是因為,我們在創建tb_student表時,沒有先創建tb_grade表,所以MySQL并不知道這個外鍵grade_id引用了哪個表,也就無法建立聯系。
2. 外鍵名字不匹配
創建表: CREATE TABLE tb_student ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, age TINYINT UNSIGNED NOT NULL, sex ENUM('男', '女') NOT NULL, grade_id TINYINT UNSIGNED NOT NULL ); CREATE TABLE tb_grade ( id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, name CHAR(2) NOT NULL ); 創建外鍵: ALTER TABLE tb_student ADD CONSTRAINT fk_grade_id FOREIGN KEY (grade_id) REFERENCES tb_grade(id);
以上代碼拋出的錯誤信息為:ERROR 1215 (HY000): Cannot add foreign key constraint
這是因為,我們在創建外鍵時,外鍵名字“fk_grade_id”與實際表中定義的“fk_student_grade_id”不一致。
3. 主鍵和外鍵類型不匹配
創建表: CREATE TABLE tb_student ( id VARCHAR(10) NOT NULL PRIMARY KEY, name VARCHAR(50) NOT NULL, age TINYINT UNSIGNED NOT NULL, sex ENUM('男', '女') NOT NULL, grade_id TINYINT UNSIGNED NOT NULL ); CREATE TABLE tb_grade ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, name CHAR(2) NOT NULL ); 創建外鍵: ALTER TABLE tb_student ADD CONSTRAINT fk_student_grade_id FOREIGN KEY (grade_id) REFERENCES tb_grade(id);
以上代碼拋出的錯誤信息為:ERROR 1215 (HY000): Cannot add foreign key constraint
這是因為,我們在tb_student表中定義的主鍵id為VARCHAR類型,而tb_grade表中定義的id為INT類型,兩者類型不匹配,無法建立外鍵。
總結:增加外鍵不成功,往往是因為表的創建或外鍵定義出現了問題。需要仔細檢查相應的代碼,找出問題所在,并進行修正。