2012-12-04 179 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