2014-10-31 38 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標誌的東西,而不是刪除它們。