Console API 쪽으로 넘어 오고 나서 조금 낮설었던 단어 중에 하나가 UPSERT였다.


OAS의 경우는 데이터를 Delete할 경우에 데이터 자체를 없애는 반면 Console의 경우는 deleted field를 '1'로 Setting하여 데이터 자체를 남겨 두었다. 그리고 같은 이름의 데이터가 들어 오게 될 경우 기존 데이터의  deleted field를 '0'로 Flip하여서 재 사용 하는 방식인 것이다.


기본적인 Idea는 괜찮았는데, 문제는 어떻게 구현되어 있는지 모른다는 것이었다.

암만해도 Console API자체가 Framework화 되어 있고, 

Model Configuration하면 자동으로 API가 생성되니 내부적으로 그냥 구현하나 보다 하고 생각하고 있었다.


근데 최근에 API에 데이터를 입력하는데 오류가 발생한다는 Issue를 Follow up하다 보니 API Framework내부에서 MariaDB의 INSERT ON DUPLICATE KEY UPDATE 구문을 사용하는 걸 발견하였다.


https://mariadb.com/kb/en/mariadb/insert-on-duplicate-key-update/


INSERT INTO ...

ON DUPLICATE KEY UPDATE

  col=expr ....


DUPLICATE CHECK 대상은 Unique Index가 생성된 Field에 대해서다. 따라서 PK도 포함된다는.

괜찮은 기능인데 Oracle에서는 보았던 기억이 없다.


뭐.. Oracle이 이런 세세한 부분에서 조금 기능이 부족한 부분이 있으니깐 뭐..


참고로 Console API에서 발생했던 이슈는..

Facebook Mapping관련 테이블인데 

다른 테이블과 달리 Facebook Account ID를 PK로 두고 , brand, member를 Unique로 두고 있는데  

( 보통 Console은 Incremental Id를 PK로 사용하는데 대체 누가 이런 테이블 구조를 만들었는지..)

PI팀에서 기존 매핑을 지우고 새로운 Account Id를 brand, member 에 Mapping하고 싶었는데 

(brand, member) 의 Unique index때문에 새로운 row를 생성하지 않고 기존 데이터의 deleted column을 0으로 Filp하는 방식으로 처리되서 문제가 발생한 것이었다.

( API Framework내부에서 PK관련 FIELD들을 ON DUPLICATE KEY UPDATE clause에서 빼버리기 때문인데 뭐  reasonable하긴 한데 이런 부분에서 좀 문제가 생길 수 밖에 없었다. )

Facebook의 AdNetwork사업을 11월에 접기로 했으니 

Code수정 없이 그냥 DBA에게 해당 PK를 업데이터 하는 Query를 실행하도록 하여 이슈를 해결하도록 했다.

'개발자세상 > Database관련' 카테고리의 다른 글

Open Cursor issue  (0) 2014.10.25
listagg function and ORA-01489  (0) 2014.01.09
Oracle TEMP 파일 삭제  (0) 2013.09.23
오라클 DB에서 테이블마다 용량 구하기  (0) 2013.08.10
Overlap 데이터 구하기  (0) 2013.08.04
Posted by headiron
,