2014-12-08 104 views
0

我有一个简单的数据库如下。它将员工映射到他们所属的部门。员工离职时,需要从Employee表和EmployeeDepartment表中删除他们的记录。同样,部门也可以改变。部门更改时,需要从DepartmentEmployeeDepartment表中删除该记录。从多个表中删除MySQL查询问题

我有一个查询,主要是的作品。但是,当其他记录开始删除时,我确实发现了一些错误。我希望有人能为我检查它。

DELETE e, ed FROM Employee e 
INNER JOIN EmployeeDepartment ed ON e.id = ed.id 
WHERE ed.id = ? 

?是我想要删除的记录的ID。

编辑

为了进一步解释,如果ID是不同时EmployeeDepartment删除将无法正常工作。因此,如果员工已创建,但尚未分配给部门,则删除将无法工作。

+1

你应该看看外键约束,尤其是级联删除。 – 2014-12-08 03:16:51

+0

我现在没有能力创建更高级的数据库......您会如何使用联接进行操作? – roundtheworld 2014-12-08 03:20:26

+0

你在同一个Employee表中有'e'和'ed'列吗? – 2014-12-08 05:11:52

回答

0

这应该做你想要什么:

DELETE e, ed FROM Employee e 
LEFT JOIN EmployeeDepartment ed ON e.id = ed.id 
WHERE e.id = ? 

请注意,您对Employee,既然你说EmployeeDepartment不能保证有记录必须匹配。

但是,我发现没有理由将其作为单个查询来执行此操作。它增加了复杂性,没有真正的好处。使用两个查询并将它们包装在一个事务中以使它们成为原子。开始一个交易,从Employee删除,然后从EmployeeDepartment删除,然后提交。

0

你在同一个Employee表中有'e'和'ed'列吗? 如果没有,试试这个:

DELETE e.*, ed.* FROM Employee e 
LEFT JOIN EmployeeDepartment ed ON e.id = ed.id 
WHERE e.id = ? 

如果这样没有帮助,然后定义外键约束在桌子上用ON DELETE CASCADE选项。

然后从父表中删除记录将删除子表中的记录。

检查此链接:http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html