2014-06-12 2 views
1

기본 쿼리/삽입을 넘어 SQL에 익숙하지 않습니다. (더 자세히 읽으면서 빠르게 볼 수 있습니다.)SQL 삽입 트리거가 이전 값에 정상적으로 액세스합니까?

다음은 매우 간단한 예제입니다.

UID | NAME | AGE | LOCATION 
45 | bob | 23 | Canada 
31 | bill | 20 | Romania 

과 같은 'person_history'두 번째 테이블 :

나는 테이블과 같은 '사람'이

내가

update person set age=10 where UID==45 

I처럼이 테이블에 삽입

UID | PID | NAME | AGE | LOCATION 
- | - | - | - |  - 

내 방아쇠를 당기고, 기존의 값에 직접 액세스하고, 두 번째 테이블로 밀어 넣고 계속하십시오. 원래의 인서트.

내가이 일을 생각할 수있는 방법은 다음과 같습니다

Select uid, name, age, location, 
into v_uid, v_name, v_age, v_location 
from person 
where uid = :new.uid 

다음

Insert into person_history(UID, PID, NAME, AGE, LOCATION) 
VALUES (sequence.nextval, v_uid, v_name, v_age, v_location); 

처럼 삽입을하지만 그 일을 매우 라운드에 대한 방법처럼 보인다 - 특히 경우 테이블에는 50 개의 열이 있습니다.

이 방법이 올바른지,이 문제를 해결하는보다 우아한 방법이 있습니다.

다시 한 번, 내가이 모든 것을 얼마나 새롭게했는지 기억하십시오. 예제가 정말 도움이 될 것입니다. 당신이이 부분?

Select uid, name, age, location, 
into v_uid, v_name, v_age, v_location 
from person 
where uid = :new.uid 

그냥이 방법을 사용하지 않는 이유

+0

어떤 DBMS를 사용하십니까? 일반적으로 귀하의 접근 방식이 완벽하게 좋다고 생각합니다. 열을 열거하는 것에 대해 걱정한다면 역사상 모든 열을 가져야 할 필요가 있다면 다시 고려해야합니다. –

답변

0

은 : 컬럼의 양에 관한

INSERT INTO person_history(UID, PID, NAME, AGE, LOCATION) 
VALUES (sequence.nextval, ::new.uid, ::new.name, ::new.age, ::new.location); 

을, 나는 그것을 할 수 있습니다 모르겠어요 "똑똑한"방법.

관련 문제