2009-04-23 6 views
2

사용자가 데이터를 편집 할 때 별도의 테이블에 변경 사항을 저장하는 트리거가 있습니다. 이 데이터는 현재 데이터 아래의 웹 페이지에 사람이 읽을 수있는 형식으로 작성됩니다. 즉,MySQL 트리거에서 IF 문을 사용하여 여러 행 삽입하기

23/04/09 22:47 James Smith는 "George Hill"에서 "George Hilling"으로 임차인 이름을 변경했습니다.

방아쇠가이 모양처럼 보입니다. (이것은 요약 된 버전입니다.)

두 질문 :

A)가이 상당히 비용이 많이 드는 성능 현명하고 수행 할 수있는 더 나은 방법이 그렇다면? B) 모든 IF없이이 작업을 수행 할 수있는 간단한 방법이 있습니까? 아마도 일종의 루프를 사용하고 있을까요?

DELIMITER // 
CREATE TRIGGER repair_history AFTER UPDATE ON repairs 
FOR EACH ROW 
BEGIN 
INSERT INTO repair_edit SET repair_id=NEW.repair_id, 
edit_date_time=NEW.edit_date_time, edited_by=NEW.edited_by; 

IF OLD.tenant_name != NEW.tenant_name THEN 
INSERT INTO repair_history SET edit_id=LAST_INSERT_ID(), field='tenant_name', 
former_field_value=OLD.tenant_name, new_field_value=NEW.tenant_name; 
END IF; 

IF OLD.priority != NEW.priority THEN 
INSERT INTO repair_history SET edit_id=LAST_INSERT_ID(), field='priority', 
former_field_value=OLD.priority, new_field_value=NEW.priority; 
END IF; 

IF OLD.property_id != NEW.property_id THEN 
INSERT INTO repair_history SET edit_id=LAST_INSERT_ID(), field='property_id', 
former_field_value=OLD.property_id, new_field_value=NEW.property_id; 
END IF; 

IF OLD.type_id != NEW.type_id THEN 
INSERT INTO repair_history SET edit_id=LAST_INSERT_ID(), field='type_id', 
former_field_value=OLD.type_id, new_field_value=NEW.type_id; 
END IF; 

END; // 
DELIMITER ; 

답변

0

는)

이 프로필이 매우 비용이 많이 드는 현명한 성능입니다. 오직 사용중인 하드웨어와 데이터베이스가 처리해야하는 업데이트의 양을 알 수 있습니다.

그렇다면 더 좋은 방법이 있습니까?

방아쇠를 당기는 데 걸린 시간을 고려하십시오. 그것은 비교입니까, 삽입입니까?

B) 모든 IF없이이 작업을 수행 할 수있는 간단한 방법이 있습니까?

불행히도, 난 의사 테이블 NEW 및 OLD

0

왜 업데이트하고 점검 할 수있는 각 열에 트리거를 넣지 않습니까? 성능에 치명타가있을 것입니다. 당신이 할 수있는 일은 트리거가 있고 그것을 가지고 있지 않은 단위 테스트를하는 것이고, 많은 행을 빠르게 바꿀 때 시간의 차이점을 확인하는 것입니다.

http://forums.mysql.com/read.php?99,174963,175381#msg-175381

+0

MySQL이 열은 트리거가의 컬럼에 인덱스에 방법을 몰라? – tpdi

+0

나는 그것을 알지 못했다.하지만 내가 보낸 포럼 응답에 따르면. –

관련 문제