2017-12-29 16 views
0

id, filename, width, height, removed_at이라는 이미지를 저장하는 테이블 ch_img이 있습니다. 테이블이 너비와 높이에 대한 업데이트를 가져오고 행이 절대 삭제되지 않습니다. 삭제는 removed_at 셀을 NULL에서 타임 스탬프로 업데이트하여 처리됩니다. 테이블에 ch_img 테이블의 id 셀에 image 외래 키가있는 다른 테이블이 있습니다. removed_at 셀을 ch_img으로 업데이트하면 image 셀이 ch_services으로 설정되어 NULL로 설정하려고합니다. 기본적으로 종류는 ON DELETE SET NULL이지만 DELETE는 없으며 업데이트가 있습니다. 그러나 ch_imgwidth/height 셀을 업데이트 할 때 Null로 설정하고 싶지 않습니다. 어떻게 처리 할 수 ​​있습니까?MySQL ForeignKey : 업데이트 타임 스탬프에 null을 설정하십시오.

답변

1

이렇게 작업을 처리하는 몇 가지 방법이 있습니다. 당신이 질문하는 방식은 trigger을 사용하는 것이 당신의 요구에 맞을 것이라고 제안합니다. 그러면 ch_img의 변경 사항을보고 다른 테이블을 조건부로 업데이트하는 논리를 작성할 수 있습니다. 트리거에 대한 문서는 많은 예제와 함께 꽤 좋습니다.

delimiter | 

CREATE TRIGGER my_trigger BEFORE UPDATE ON ch_img 
    FOR EACH ROW 
    BEGIN 
    IF NEW.removed_at > 0 THEN 
     UPDATE ch_services SET img_id = NULL WHERE img_id = NEW.id; 
    END IF; 
    END; 
| 

delimiter ; 

그러나, 고려해야 할 트리거를 사용하지 않는 이유가있다 :

코드는 같을 것이다. 다른 모든 코드에서 멀리 떨어진 비밀 은둔 장소에 비즈니스 로직을 작성한다고 가정합니다. 트리거 추적을 잃거나 존재하지 않는다고 쉽게 잊어 버릴 수 있습니다.

퍼포먼스가 큰 관심사가 아니라면 모든 논리를 한 곳에 모으기 만하면 코드를 유지 관리하기가 더 쉬울 것이라고 주장합니다. 이 경우 코드에 추가 쿼리를 작성할 수 있습니다.

나를 강력히 반대하는 사람들이 분명합니다.

트리거는 확실히 작업을 완료하지만 프로세서 밀리 초가 엔지니어 시간보다 더 가치가 있는지 여부에 따라 다릅니다.

+0

아주 좋은 답변입니다 - 감사합니다! 나는 처음부터 방아쇠를 당긴다. 그러나 나는 그들을 좋아한다. 하지만 나는 아주 쉽게 트리거를 추적 할 수 있다는 것에 동의합니다. 나는 이것을 처리하기 위해 외래 키에 더 간단한 옵션이 있다고 생각했다. 그렇지 않다면 내 논리를 내 코드에 그대로 두는 것이 좋습니다. – PhilHarmonie