2014-10-31 20 views
0

我在我的数据库中有2个表。SQL DELETE警告

CREATE TABLE `Managers`(
`idManagers` INT NOT NULL AUTO_INCREMENT, 
`fullName` VARCHAR(100), 
`address` VARCHAR(100), 
`worksSince` DATE, 
`salary` DOUBLE, 
PRIMARY KEY (`idManagers`)) ENGINE = InnoDB; 


CREATE TABLE `Sell` (
`idSell` INT NOT NULL AUTO_INCREMENT, 
`idManagers` INT, 
`item` VARCHAR(100), 
`price` DOUBLE, 
`sellDate` DATE, 
PRIMARY KEY (`idSell`), 
INDEX `s1_idx` (`idManagers` ASC), 
CONSTRAINT `s1` 
FOREIGN KEY (`idManagers`) 
REFERENCES `Managers` (`idManagers`) 
ON DELETE NO ACTION 
ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

我需要删除的经理,那些没有在2013年 卖什么,我想出了:

DELETE managers from managers join sell on sell.idManagers=managers.idManagers where NOT 
YEAR(sell.sellDate) = 2013; SET FOREIGN_KEY_CHECKS=0 

它工作正常,但我不得不禁用外键检查,因为我有一个错误,我无法删除或更新父行。我想知道,有没有办法做到这一点,而不禁用外国检查?

+0

可能是写一个触发之前执行它删除,并先删除子数据,或使用删除级联选项来约束 – 2014-10-31 10:15:02

+0

所以我要删除现有键,删除我需要什么,并添加一个新的外键删除后? – 2014-10-31 10:20:45

回答

1

这太长了评论。

如果你想删除的管理者,但保留早期的销售,他们有,然后取出foreign key参考。在表格之间你将没有关系完整性。换句话说,不要在数据结构中撒谎。

相反,你可能会考虑增加一个标志到managers表来描述管理者是否有效或无效。然后您可以基于最近的销售更新标志并保留外键参考。

或者,从两个表中删除的管理者。

+0

很棒的回答。谢谢 – 2014-10-31 10:24:09

0

基本上有两种方法可以做到这一点,根据不同的情况:

添加“ON DELETE CASCADE”到你的外键约束。这会自动删除任何子行。

如果你不能改变你的数据库结构:简单地做它在两个查询,先删除子行。

仔细想一想,如果它是可以接受的子行被删除。也许更好的解决方案是向你的经理添加一个类似于IsActive标志的东西,而不是删除它们。