今天在寫數據庫作業時,遇到的無法創建外鍵問題
create table department
(dept_name varchar(20),
building varchar(15),
budget numeric(12,2) check (budget > 0),
primary key (dept_name)
);
create table course
(course_id varchar(8),
title varchar(50),
dept_name varchar(20),
credits numeric(2,0) check (credits > 0),
primary key (course_id),
foreign key (dept_name) references department
on delete set null
);
需要了解幾點,什麼是主鍵外鍵?自己查;約束?表的主鍵和其他表的外鍵關聯時,要求數據類型和屬性都相同。
嗯,我確認了一遍,類型和屬性都相同。最後發現是 reference 後面只有父表的名,卻沒有對應列的信息references department
。改成references department(dept_name)
就好了(建表SQL文件是從SQLserver拿過來的,語法不同吧)。
常見幾種無法創建外鍵的可能
- 父表不存在
- 先創建父表,再創建子表;
SET FOREIGN_KEY_CHECKS=0;
後,創建子表,再創建父表;SET FOREIGN_KEY_CHECKS=1;
- 標點符號使用不對
- 對應列名拼錯
- 對應列的數據類型和屬性不一致
- 父表和子表 表(或列)的字符集 或 排序集 不同
- 父表中相關列上沒有任何索引
- 父表相關列有索引,但索引是一個多列索引,同時該列不是該做索引最左列
- 父表不是innodb
- 父表是分區表
- MySQL5.7以上,父表中相應列是虛擬列,不是實際存儲列
- reference 後面沒有列信息
- 對約束操作使用 SET DEFAULT
你可以創建失敗時,使用
SHOW ENGINE INNODB STATUS\G
,顯示更多具體的錯誤信息,而非僅僅Err 1215.
詳細疑問解釋和解決方法可參考:Dealing with MySQL Error Code 1215: “Cannot add foreign key constraint”