2012-12-04 249 views
1

找不到任何問題,真正幫助我,所以繼承人另一個。添加外鍵約束

我試圖設置一個外鍵約束在一個表(dempartment)上,並將其鏈接到表(employee)上的主鍵列上的員工被稱爲(dno),並在部門上調用(dnumber)。這兩個字段是相同的類型,但我不斷收到

mysql> alter table department 
    -> add foreign key (dnumber) 
    -> references employee (dno); 
ERROR 1005 (HY000): Can't create table 'dba110.#sql-938_3' (errno: 150) 

有什麼建議嗎?

UPDATE: 所以我想看看我的DNO和dnumber列帶符號。

mysql> show create table employee; 
+----------+------------------------------------------- 
------------------------------------------------------- 
------------------------------------------------------- 
| Table | Create Table 


+----------+------------------------------------------- 
------------------------------------------------------- 
------------------------------------------------------- 
| employee | CREATE TABLE `employee` (
    `Fname` varchar(8) DEFAULT NULL, 
    `Minit` varchar(2) DEFAULT NULL, 
    `Lname` varchar(8) DEFAULT NULL, 
    `SSN` varchar(9) NOT NULL, 
    `Bdate` date DEFAULT NULL, 
    `Address` varchar(27) DEFAULT NULL, 
    `Sex` varchar(1) DEFAULT NULL, 
    `Salary` float NOT NULL, 
    `Superssn` varchar(9) DEFAULT NULL, 
    `Dno` int(1) NOT NULL, 
    PRIMARY KEY (`SSN`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 | 
+----------+------------------------------------------- 
------------------------------------------------------- 
------------------------------------------------------- 
1 row in set (0.00 sec) 

mysql> show create table department; 
+------------+----------------------------------------- 
-------------------------------------+ 
| Table  | Create Table 
            | 
+------------+----------------------------------------- 
-------------------------------------+ 
| department | CREATE TABLE `department` (
    `dnumber` int(1) NOT NULL, 
    `dname` varchar(15) DEFAULT NULL, 
    `mgrssn` varchar(9) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 | 
+------------+----------------------------------------- 
-------------------------------------+ 
1 row in set (0.00 sec) 
+0

你有EMPLOYEE表之前創建的部門表? :-) – bonCodigo

+0

根據您的問題的更新,爲什麼你的錯誤很明顯。您的表格設計是正確的,只需要將創建兩個表格的執行順序與員工表中的外鍵引用交換即可。或者做更改員工,而不是部門。 Coz一個部門可以有很多員工。 – bonCodigo

+0

任何機會,你可以給我的代碼。因爲我認爲我已經嘗試了兩種方式。一種方法給了我錯誤1072和另一種方式,你談論給我: 錯誤1005(HY000):無法創建表'dba110。#sql-938_3'(錯誤:150) – SkyVar

回答

1

是不是正確的表結構應該是,有外鍵DEPTID

員工。

E.g.

alter table employee add foreign key (dnumber) references department (dno); 

如果您需要更改設計的能力,我建議你保持dept的父母,並拉動其ID爲員工參照完整性。 :-)

編輯按OP的評論

PS:在移動這樣的代碼片段將不會有代碼的標籤。並希望我可以在SQLFIDDLE中給你一個示例。

步驟:

create table department 
(dno int not null primary key, 
dname varchar(15), 
mgrno int UNSIGNED null) 

Insert into department  
(dno, dname, mgrno)  
Values  
(), 
(), 
() 
; 

Create table employee 
(eid int not null primary key, 
ename varchar(25), 
mid int not null, 
did int not null, 
foreign key (did) references 
department (dno)) 

Insert into employee 
(eid, ename, mid, did) 
Values 
(), 
(), 
(), 
(), 
() 
; 

請嘗試上述結構。所以你的主鍵被設置,外鍵被設置。我只爲這兩個表添加大多數主要字段。您可以添加其他列。

+0

在我教授的指點,他談到保持參照完整性。但我試了你的方式,並得到了錯誤: 錯誤1072(42000):表中不存在鍵列'dnumber' – SkyVar

+0

您的設計有點複雜,因爲它具有循環依賴和遞歸關聯。這些類型的關係使您的表格架構優雅,但需要您以完全審查/適當的更改/刪除執行順序對其進行管理。我的意思不是讓人感到困惑。但是,如果你真的打算去設計你的設計,那麼你最好仔細閱讀這些主題:)我可以用一個更簡單的設計更新我的文章或者解釋上面的內容。 – bonCodigo