* 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 문 해당 값들로 컬럼이 업데이트된다 ('추가' 되는게 아님 ! 업데이트임 !)
반응형