Mysql

[Mysql / MariaDB] 데이터 조회 후 없으면 insert , 있으면 update - insert into ... on duplicate key update (merge문)

문앵 2022. 10. 11. 15:40

* INSERT INTO ... ON DUPLICATE KEY UPDATE

데이터를 디비에 insert 해줄때 , 먼더 테이블에 해당하는 데이터가 있는지 조회한 뒤 없으면 insert 해주고 , 있으면 update 해주는 쿼리.

oracle 에서의 merge 기능과 같다고 한다.

 

* 쿼리문

 

--> 중복을 판단하는 기준은 unique key 이고 , 이 키를 먼저 설정해놔야 한다 
--> unique key 설정 쿼리문 : ALTER TABLE 테이블명 ADD UNIQUE(컬럼명1, 컬럼명2) 

 

/* insert into ... on duplicate key update 문 */
INSERT INTO 테이블명 (
	 컬럼명1
	,컬럼명2
	,컬럼명3
    	,컬럼명4
    ) VALUE (
     '값1'
    ,'값2'
    ,'값3'
    ,'값4'
    )
    ON DUPLICATE KEY UPDATE
      컬럼명3 = '업데이트 될 값1'
      컬럼명4 = '업데이트 될 값2'

 

 

 

* 예제 

ALTER TABLE bycle UNIQUE(X_LAT, Y_LONG) 
// bycle 테이블에서 X_LAT, Y_LONG 컬럼을 unique key로 지정
// -> 해당 컬럼의 값을 기준으로 중복이 있는지 없는지를 판단하게 됨.

INSERT INTO bycle( // bycle 테이블 각 컬럼에 데이터를 추가해주겠다
      X_LAT
    , Y_LONG
    , REPORT_DATE
    , CREATE_DATE
    , TILT
    , BATTERY
) VALUE ( // 아래로 추가해주는 데이터 값들
      '33.250214'
    , '126.520283'
    , '2022-10-11 10:25:52'
    , '2022-10-11 11:31:03'
    , 'N'
    , '4'
)
ON DUPLICATE KEY UPDATE // 중복 데이터가 있다고 판단되면, 아래의 컬럼들을 '' 내부의 값들로 업데이트 해줘라
	REPORT_DATE = '2022-10-07 11:20:39'
    , CREATE_DATE = '2022-10-11 14:27:03'
    , TILT = 'dup'
    , BATTERY = '4'
    // 이때 주의할 점은 , unique key의 값을 업데이트 친다고 설정하면 안됨. 당연한거지만.
    // UK를 제외하고 나머지 컬럼중에서~ 업데이트하고 싶은 컬럼과 그 값만 여기에 설정해줄 수 있음

 

 

이 뭐리문을 실행해보면, 처음 실행시 -> 데이터가 없으므로 데이터가 insert되고, 

쿼리문을 한번 더 실행하면 update 문 해당 값들로 컬럼이 업데이트된다 ('추가' 되는게 아님 ! 업데이트임 !)

 

반응형