2011-04-06 2 views
4

가정하자 나는 다음과 같은 스키마를 가지고 :역은 CASCADE 삭제

CREATE TABLE `users` (
    `id` int(10) unsigned auto_increment, 
    `historyId` varchar(255), 
    PRIMARY KEY (`id`) 
); 

CREATE TABLE `histories` (
    `id` int(10) unsigned auto_increment, 
    `history` TEXT, 
    PRIMARY KEY (`id`) 
); 

사용자 오직 하나 개의 역사와 역사 사용자를 가리 가지고 있지의 목적을있다가 그이 언급되지 않은 다른 많은 테이블 (스키마)에는 또한 히스토리가 있습니다.

사용자를 삭제하면 해당 기록도 삭제할 수 있도록 만드는 가장 간단한 방법은 무엇입니까?

답변

0

사용자 - 역사 있다면 그것은 당신이 사용자 테이블에 제약 조건을 넣어 수없는 1-1 관계 년대 'hisories'캐스케이드 여기 삭제에 난 당신이 외부 키를 사용할 수 있다고 생각하지 않습니다 하나

+0

-1. 질문을 인용하자면 : '이력을 가지지 않는 목적은 사용자에게이 스키마에 언급되지 않은 많은 다른 테이블에도 이력이 있습니다.' – Gili

1

왜냐하면 데이터 유형이 일치하지 않기 때문입니다. 한 테이블에는 VARCHAR (255), 다른 테이블에는 INT (10)가 있습니다. (그게 뭐야?)

트리거 나 저장 프로 시저 중 하나만 사용해야하며 둘 다 완전히 만족스럽지 않을 것입니다. 트리거는 이론적으로 가장 안전합니다. 클라이언트 코드가 주변에 몰래 들어설 수는 없습니다. (클라이언트 코드는 저장 프로 시저를 호출하는 것을 피할 수 있습니다.) 그러나 APIs that don't activate MySQL triggers이 있습니다.

MySQL 트리거는 SQL 문으로 만 활성화됩니다. 그들은 당신이 같은 트리거를 사용할 수있는 MySQL 서버

2

에 SQL을 문을 전송하지 않는 API를 만든 테이블의 변화에 ​​의해 활성화되지 있습니다

DELIMITER $$ 
CREATE TRIGGER delete_user_history_on_delete_user 
AFTER DELETE ON `users` 
FOR EACH ROW 
BEGIN 
DELETE FROM `histories` WHERE id = old.historyId; 
END$$ 
DELIMITER ; 
+0

MySQL 설명서에 설명되어 있습니다. 다음은 [link] (http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html)입니다. – devrique

관련 문제