2014-10-31 2 views
0

데이터베이스에 테이블이 2 개 있습니다. 2013 아무것도를 판매하지 않았다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; 

내가 매니저를 삭제하기 위해 필요한, 내가 해낸 : 그것은 잘 작동

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

,하지만 난 때문에, 외부 키 체크를 해제했다 상위 행을 삭제하거나 업데이트 할 수 없다는 오류가 발생했습니다. 외화 수표를 사용하지 않고이 작업을 수행 할 수있는 방법이 있습니까? 당신의 외래 키 제약 조건을 'DELETE CASCADE ON'

추가 :

+0

은 먼저 자식 데이터를 삭제하고 삭제하기 전에 트리거를 작성하고 실행하거나 제한 조건에 delete cascade 옵션을 사용하십시오. –

+0

그래서 기존 키를 삭제하고 필요한 것을 삭제하고 새로운 외래 키를 추가해야합니다 삭제 후? –

답변

1

댓글이 너무 깁니다.

관리자를 삭제하고 이전 판매량을 유지하려면 foreign key 참조를 삭제하십시오. 테이블 사이에는 관계형 무결성이 없습니다. 즉, 귀하의 데이터 구조와 거짓말하지 마십시오.

대신 managers 테이블에 관리자를 활성 또는 비활성으로 나타내는 플래그를 추가하는 것이 좋습니다. 그런 다음 최근 판매를 기]으로 플래그를 갱신하고 외 부 키 참조를 보존 할 수 있습니다.

또는 두 테이블에서 관리자를 제거하십시오.

+0

좋은 답변입니다. 고맙습니다 –

0

은 기본적으로 상황에 따라이 작업을 수행하는 방법은 두 가지가 있습니다. 그러면 모든 하위 행이 자동으로 삭제됩니다.

데이터베이스 구조를 변경할 수없는 경우 : 먼저 두 개의 쿼리에서 하위 행을 먼저 삭제하면됩니다.

자식 행이 삭제되는 것이 허용되는지 신중히 생각하십시오. IsActive 플래그를 삭제하는 대신 관리자에게 추가하는 것이 더 좋은 해결책 일 수 있습니다.