본문 바로가기
DBMS/SQLite

[SQLite] 시퀄라이트_데이터 있으면 UPDATE 없으면 INSERT 처리 (feat. INSERT OR REPLACE INTO)

by 썸머워즈 2020. 1. 14.
반응형



- INSERT OR REPLACE INTO 구문 -


테이블에 데이터가 이미 있으면 업데이트 하고, 없으면 값을 넣어줘야 하는 경우가 있는데


오라클에서는 MERGE INTO 구문을 지원해 주기 때문에 편하지만 


SQLite지원을 안해줘서 없는줄 알았는데


찾아보니 비스무리한게 하나 있어 정리해둔다.


바로 


INSERT OR REPLACE INTO 구문이다.


해당 구문에 대해 알아보자


INSERT OR REPLACE INTO [TABLE]

( COLUMN1, COLUMN2, COLUMN3, ...)

VALUES

( VALUE1, VALUE2, VALUE3, ...)

...     -- WHERE 기타 등등


구문 자체는 기존 INSERT INTO 문과 동일하되 중간에 OR REPLACE가 추가된것이다.


예)


CREATE TABLE MINE(

id VARCHAR(10) PRIMARY KEY,

name VARCHAR(10),

age VARCHAR(5),

salary NUMBER

)


간단하게 MINE 이라는 테이블이 있다고 가정하자.


이 테이블에 이제 값을 넣어보자


INSERT INTO MINE VALUES ("CD2", "HAN", "20", 20000);


이러한 값을 넣었다 치고 


다시한번 값을 넣어보자


INSERT INTO MINE  (id, name, age, salary

VALUES ("CD2", "KIM", "27", 512345);


일반적으로 이런식으로 같은 PK 값으로 값을 넣으면 


무결성 제약조건 에러가 발생한다


이미 고유키를 가진 값이 존재하는데 같은것을 또 넣을려해서 생기는 에러이다.


그럼 아래와 같은 경우는 어떨까?


INSERT OR REPLACE INTO MINE (id, name, age, salary)

VALUES ("CD2", "KIM", "27", 512345);


INSERT OR REPLACE INTO MINE (id, name, age, salary)

VALUES ("CD3", "HO", "37", 5245);


이런식으로 사용하게 되면 


값이 있어도 무결성 제약조건 에러가 발생하지 않고


해당 pk 값을 가진 데이터를 update 처리를 진행해주고 

(정확히는 update가 아니다. 아래에서 설명)


값이 없으면 insert 처리를 해준다.


<데이터 결과값>


id 

name 

age 

salary

CD2

KIM 

27 

512345 

CD3

HO 

37 

5245 





여기서 하나 주의할 점있는데


정확하게는 REPLACE INTO 라는 구문이


UPDATE 구문이 아니라는 점이다.


REPLACE INTO는 무결성 제약조건에 걸려버리면


중복되는 레코드를 지워버리고 새로운 레코드를 삽입해 버리기때문에


만약 자동 증가되는 PK가 있을경우 기존의 레코드가 삭제되어버리는 불상사가 발생하니


자동증가되는 고유값 (AUTO_INCREMENT) 이 없을때 사용하면 좋다.



 DUPLICATE ON KEY UPDATE 라는 구문이 있는데


해당 구문은 SQLite에서는 지원을 안하는것으로 파악된다.


반응형


댓글

TOP