2014-03-05 91 views
0

處理數據庫類分配的介紹,並在幾個外鍵上遇到問題。我做了幾個外鍵,但是偶爾我會陷入困境,不知道爲什麼它不起作用。定義外鍵的麻煩(MySQL)

這個例子是一所大學的數據庫,我有段

describe section; 
+--------------+-------------+------+-----+---------+-------+ 
| Field  | Type  | Null | Key | Default | Extra | 
+--------------+-------------+------+-----+---------+-------+ 
| course_id | varchar(7) | NO | PRI |   |  | 
| sec_id  | varchar(10) | NO | PRI |   |  | 
| semester  | varchar(10) | NO | PRI |   |  | 
| year   | int(11)  | NO | PRI | 0  |  | 
| building  | varchar(20) | YES | MUL | NULL |  | 
| room_no  | varchar(5) | YES |  | NULL |  | 
| time_slot_id | varchar(5) | YES | MUL | NULL |  | 
+--------------+-------------+------+-----+---------+-------+ 

我想做一個需要數據庫,我能夠做出IDcourse_id外鍵,而其他任何一個我嘗試沒有按't work

create table takes(
    ID int, 
    course_id varchar(7), 
    sec_id varchar(10), 
    semester varchar(10), 
    year int, 
    grade int, 
    primary key (course_id, sec_id, semester, year), 
    foreign key (ID) references student(ID) 
    on delete cascade on update cascade, 
    foreign key (course_id) references section(course_id) 
    on delete cascade on update cascade 
) engine = innodb; 

直到這一點起作用。 如果我嘗試添加此,它給我errno: 150

foreign key (sec_id) 
    references section(sec_id) 
    on delete cascade on update cascade 

任何幫助表示讚賞。我想我可能會錯過關於外鍵的一些基本知識,因爲它對course_id有效,但對sec_id不起作用,它似乎完全相同?

+0

後看到'錯誤號:150',運行'SHOW ENGINE INNODB STATUS'。它包含有關爲什麼它在新的外鍵添加失敗的信息。 –

回答

0

可能性:

  1. 數據類型,包括無符號,不匹配。
  2. 父字段未編入索引。

如果數據類型匹配,也許您尚未在要定義外鍵關係的父列上定義索引。請檢查表section中的列sec_id是否有任何已定義的索引。

參考

0

確保CHARACTER SET和兩個領域的COLLATION是相同的,即,takes(sec_id)section(sec_id)

請參閱此檢查清單:http://verysimple.com/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/

+0

看起來好像它們都是一樣的。對於sec_id,排序規則爲latin1_swedish_ci,年份爲NULL。 – user3381741

+0

「節」表的引擎是什麼? 請檢查答案中的鏈接。 – Deepak

+0

兩臺發動機都是innodb。現在檢查鏈接,謝謝。 – user3381741