2012-09-12 2 views
0

db에 데이터를 삽입 할 때 이전 레코드와 현재 레코드를 비교해야합니다. neccassary 인 경우 현재 레코드의 일부 값을 수정해야합니다.MySQL 트리거 : 삽입 전에 이전 레코드와 레코드 비교

다음과 같이 일부 SQL을 시도했지만 모두 SQL 오류가 발생합니다. 이 하나는 나에게 하나 이상의 레코드를 선택한다는 오류를 준다.

DELIMITER $$ 
CREATE 
    TRIGGER set_moment_display 
    BEFORE INSERT ON data 
    FOR EACH ROW 

    BEGIN 
     DECLARE moment DATETIME; 

     SELECT press_moment_1 INTO moment FROM data LIMIT 1; 

     IF moment > NEW.press_moment_1 THEN SET NEW.press_moment_1 = moment; 
     END IF; 
    END$$ 
DELIMITER ; 

위에서 설명한 내용을 어떻게 달성 할 수 있습니까?

답변

0

별칭 "OLD"를 사용할 수 있습니다.

You can refer to columns in the subject table 
(the table associated with the trigger) by using the aliases OLD and NEW. 
OLD.col_name refers to a column of an existing row before 
it is updated or deleted. NEW.col_name refers to the column 
of a new row to be inserted or an existing row after it is updated 

UPDATE

짐 개리슨이 제대로없는 "삽입하기 전에"나에게 실수를 지적했다 "OLD." 이 별칭은 UPDATE 및 DELETE에 대해서만 작동합니다.

+0

업데이트 트리거에서만 작동하지 않습니까? 삽입물에는 이전 값이 없습니다. –

+0

Ooopss ... 실수해서 미안해! 나는 지금 "이전에 INSERT" –

0

SQL 데이터베이스에 행 순서 지정의 암시 적 개념 (모든 쿼리에 대해 순서 지정 조건 제공)이 없으므로 트리거가 볼 수있는 "이전"행이 없습니다. "이전에 삽입 된 행"은 삽입 트리거의 컨텍스트에서 의미가 없습니다.

잠시 동안 테이블에 행을 삽입하는 프로세스가 여러 개 있다고 가정합니다. 프로세스 # 1의 삽입을 위해 트리거가 실행되면 어떤 행이 "이전"행입니까? 프로세스 # 1에서 이전에 삽입 한 것입니까? 연대 기적으로 "가장 최근"의 행이 프로세스 # 3에 실제로 삽입되었다고 가정하십시오.

알고 계신 키 값을 사용하여 "가장 최근"으로 이해하는 행을 식별 할 수 없다면 트리거에서이를 수행 할 필요가 없습니다. 그렇지 않으면 삽입을 수행하는 응용 프로그램에서 처리해야합니다.

관련 문제