Search

2016년 1월 12일 화요일

[Database] [MSSQL] MERGE 구문 사용하기. (중복항목에는 UPDATE, 신규항목에는 INSERT)

* INSERT 혹은 UPDATE에 대한 트리거를 설정하다보면,
 기존 Key를 대상으로 중복항목이 들어오면 변경사항을 UPDATE해줘야 하고,
 신규 항목이 들어오면 INSERT를 해줘야 하는 경우가 있다.

* 먼저, MERGE 구문의 동작을 이해하기 위해 예제를 하나 준비했다.
* Item_A 테이블과 Item_B 테이블이 있는데, 그 구조가 동일하다고 가정해보자.
  (테이블에는 두 컬럼 Item_Code(PK)와 Item_Name이 있다고 가정하자.)
* 우리는 지금 두 테이블 Item_A와 Item_B를 병합하려 한다. 기준은 Item_A테이블로 잡았다. (즉, Item_Code 값이 중복되면, Item_A테이블의 Item_Name이 우선순위이다. Item_A테이블에 없는 Item_Code가 Item_B테이블에 있다면, Item_A테이블에 추가한다.)

-- MERGE구문을 이용한 코드는 다음과 같다.

MERGE Item_A
USING Item_B
ON (Item_A.Item_Code = Item_B.Item_Code)

WHEN MATCHED THEN
UPDATE SET Item_A.Item_Name = Item_B.Item_Name

WHEN NOT MATCHED THEN
INSERT (Item_A.Item_Code, Item_A.Item_Name) Values (Item_B.Item_Code, Item_B.Item_Name);



* 그렇다면, 추가로 트리거까지 생각을 해보자.
* 테이블에 INSERT되거나 UPDATE된 내용에 대해서 기존의 테이블에 있는 내용이라면 UPDATE를, 신규항목이라면 INSERT를 동작하게 하려면 어떻게 해야할까?
 예를 들어, Item_Table에는 Item_Code(PK)와 Item_Name을 사용해 제품을 관리중이다.
 여기에 Stock_Table(재고) 테이블이 존재하는데, 이 테이블에 매일 INSERT 혹은 UPDATE 작업을 통해 남아있는 아이템과 재고들을 관리해야하는 상황이다.
* 상품은 새로 추가될수도 있고, Item_Code에 대한 제품명이 바뀔수도 있는 상황이다.
 이 상황에서 Stock_Table에 데이터를 넣으면, 자동으로 Item_Table을 관리되게끔 만드는 트리거는 다음과 같이 작성할 수 있다.

CREATE TRIGGER tr_updateItemCode
ON [dbo].[Stock_Table]

/* 내용 : 재고테이블(Stock_Table)의 아이템에 대한 정보를
          Item_Code를 기반으로 Item_Table 테이블에 자동으로 등록 */

AFTER INSERT, UPDATE
AS
  BEGIN

   MERGE Item_Table i
   USING (SELECT DISTINCT Item_Code, Item_Name FROM Inserted) n
   ON (i.Item_Code = n.Item_Code)

   WHEN MATCHED THEN
    UPDATE SET i.Item_Name = n.Item_Name,

   WHEN NOT MATCHED THEN
    INSERT (i.Item_Code, i.Item_Name)
    VALUES (n.Item_Code, n.Item_Name);
  END




댓글 없음:

댓글 쓰기