삽질의 현장/- DataBase

[삽잡이::sql] 없으면 Insert 있으면 Update! DUPLICATE ON KEY UPDATE

shovelman 2016. 6. 16. 20:31


기존에 값이 있는 레코드를 

중복해서 Insert 하게 되면 어떻게 될까요!?



저는 스포츠를 좋아하니까!

축구로 예를 들어봅시다.


슛~ 골은 나의 친구~  


자... 명문구단 삽질 FC 에서 '삽질'이라는 이름의 선수를 영입했습니다.

포지션은 공격수이고, 아주 유능한 선수 같습니다.


이 선수가 입단하면서 자기는 에이스가 될 것이니

등번호를 10번으로 받겠다고 합니다.


멋도 모르고 알겠다고 했습니다.

그리고 선수 등록을 위해 DB에 등록을 시도했습니다.


그리고 느끼죠.... 우리에게 친숙한....

그래 맞습니다. ERROR...



오류코드가 1062 입니다.

그리고 그 아래를 보시면 Duplicate entry '10' for key 'PRIMARY' 

라는 Error 발생 이유가 찍혀있습니다.


등번호는 삽질 FC에서 유일성을 보장해주고 있습니다.

축구 경기 규칙상 같은 편 안에 동일한 등번호를 달고 뛸 수 없을 것입니다.



등번호 10번은 나만의 것이야!!!! 


삽잡이가 발광하군요...


아무튼, 등번호는

  PRIMARY KEY이기 때문에 

중복되는 Key가 같은 Table안에 존재할 수 없습니다.


즉, 등번호라는 컬럼에

제약 조건(PRIMARY)이 설정되어있기 때문에 

중복된 값을 삽입할 수 없던 것입니다!


자~ 그런데 상황이 달라졌습니다.

엄청난 거액의 연봉으로 삽잡이는 중동에 있는 리그로 떠나버렸습니다.


안녕~ 난 돈벌러 갈래~ 


이때다 싶어서 동명이인인 삽잡이가 

등번호 10번을 차지하려고한다고 가정해봅시다.

물론, 등번호 10번의 떠난 삽잡이의 데이터를 지웠다고 하겠습니다.


그런데!!! 사실 방금 떠난 삽잡이가 

등번호 10번을 받을 수 있던 이유가

Auto_Increment 때문이었다는 것입니다!!!

(등록 될 때마다 자동으로 증가되는.... )


아하 그렇군요...

등번호 10번의 삽잡이는 단지 10번째로 등록이 되었기 때문에

등번호가 10번이었던 것입니다.


뭐 여러가지 방법이 있겠지만....

지금은 Duplicate On Key에 대해서 설명을 하는 것이니....


무식하게(?) 구단 내 DB 관리자는 

지금 등번호 7번의 삽잡이를 다시 등록했습니다.

INSERT 문으로 말입니다!!!


1
INSERT INTO Sap_FC_db (backNumber, name) VALUE (10'삽잡이') DUPLICATE ON KEY UPDATE backnumber = 10;
cs


아 안된다고!!! 아까 위에서 INSERT 했을 때 안됬잖아!!!! 


...



예 그렇습니다.

구단 내 DB 관리자는 무식하지 않았습니다.

Qeury가 성공적으로 수행되었습니다.


그런데 이상하지 않습니까!?

INSERT문은 데이터 삽입할 때 사용하지 않나요!?


예 맞습니다. 

그런데, 이미 데이터가 존재하는 경우 

DUPLICATE ON KEY UPDATE 구문을 사용하여 


만약 데이터가 존재한다면, 

해당 구문 이하의 값들을 Update 시키겠어!

라는 뜻이 됩니다.


오늘도 또 하나를 배우군요~


굳~