본문 바로가기
Programing/C#

[MERGE INTO]데이터가 없으면 INSERT, 있으면 UPDATE

by june._.note 2017. 2. 6.

DB에 데이터를 넣는 프로그램을 만들때 내가 넣으려는 데이터가 있으면 Update하고,

 

없으면 새로 INSERT를 하고 싶은 경우가 종종 있음.

 

프로그램은 역시 목적을 이루기 위한 다양한 방법이 있음. 이중에 내가 어떤걸 선택하고 어떻게 처리하느냐의 문제.

 

  • SELECT를 통해 데이터가 있는지 확인후 없으면 INSERT 있으면 UPDATE
  • Try ~ Catch ~
    : 프로그램 상에서 무조건 INSERT를 하고, Try Catch로 INSERT시 Oracle 프라이머리키 중복 에러가 발생하면
    Catch 부분에서 Update 구문을 실행하는 방법이 있음.
  • MERGE INTO (참조 : http://son10001.blogspot.kr/2014/04/merge-into-insert-update.html)
    : MERGE INTO라는 쿼리를 이용하는 방법.
    • MERGE INTO [작업할 Table명]
                USING [비교할 Table 명 또는 VIEW]
      ON ([조건])
      WHEN MATCHED THEN
              [UPDATE 쿼리]
      WHEN NOT MATCHED THEN
              [INSERT 쿼리]
    • ex) 다른 곳에서 가져온 값을 입력해야하는 경우, USING뒤에 넣어야하는 조건(Table 및 View)라는 형식 때문에
      (SELECT [값,,] FROM DUAL , DUAL Table에 대한 설명은 아래 사이트 참조)을 통해 쿼리리 결과를 이용해야 함.
                  ( http://thebetterday.tistory.com/entry/ORACLE-DUAL-TABLE : ORACLE DUAL TABLE)
      MERGE INTO TEST A
                USING (SELECT "DATA1" AS COLUMN1, "DATA2" AS COLUMN2 FROM DUAL) B 
      -- DUAL을 통해 입력할 데이터 값은 입력 대상인 TEST 테이블의 컬럼 명과 동일하게 Aliases 해주면 편리할 듯.
                ON A.COLUM1 = B. COULUM2
      WHEN MATCHED THEN
      WHEN NOT MATCHED THEN
  • [Mysql]
    ON DUPLICATE KEY UPDATE (참조 : http://mamstory.tistory.com/591)
    : UNIQUE INDEX 또는 PK와 중복되는 경우 Insert 대신에 Update를 수행해줌.
    REPLACE와 다른 점은 이전 값이 유지되는 상태에서 지정된 칼럼의 값만이 변경 된다는 것.
    • INSERT ... ON DUPLICATE KEY UPDATE

 

 

** 아.. 일단 DB와 관련해서 이야기를 하려면 어느 DB를 사용하는지에 대한 언급이 필요하며, 비슷비슷하긴하지만

   DB별로 문법이 다를 수 있다는걸 간과했다. 위에서 제시한 ON DUPLICATE KEY UPDATE는 PL/SQL에서는 사용할 수 없다.

   MERGE INTO를 사용해야함. ( http://stackoverflow.com/questions/17254018/oracle-on-duplicate-key-update )