( DATABASE ) mariaDB INSERT 사용시 중복(Duplicate Error) 해결

ZZOOO

·

2021. 4. 13. 14:50

안녕하세요 오늘은 mariaDB를 사용할때에 한번쯤 겪을 수 있는 중복 에러에대하여 다루어보고자합니다.

 

mariaDB 공식 홈페이지에서 검색하여 문제를 해결했으나 기록 겸 혹여나 찾으시는분이 계실까 포스팅합니다.

 


상황

 

기존 본인의 DB에는 ( 고유번호 ) no = 71 번인 row가 있었습니다.

여기에 제가 구현하고자하는 기능은 단순히 정보 수정이 아닙니다.

 

암호화되어있는 어떤 문자열을 파싱하여 나온 값들을 확인 후 사용자가 등록을 요청하는 기능이였습니다.

하지만, 이미 등록이되어있는 상황이라면, UPDATE 기능을 사용하면되는데

그렇다면 최초등록을 할 수 없기에 다른 방법을 찾아봐야했습니다.

( 제가 처한 상황이 이해가 가지않으실 수 있습니다 . )

 

( UPDATE SET 구문을 사용했을때는 최초등록 기능을 구현할 수 없어 사용하지 못하였습니다. )


에러

 

Duplicate entry ~~~~~ for key 'PRIMARY' ...

 

해결 방법

 

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

 

INSERT ON DUPLICATE KEY UPDATE

INSERT if no duplicate key is found, otherwise UPDATE

mariadb.com

 

그래서 본인은 mariaDB 홈페이지에 접속하였습니다.

 

INSERT ON DUPLICATE KEY UPDATE 

 

라는 Syntax를 사용할것입니다.


mariaDB Syntax

 

INSERT [LOW_PRIORITY | delayed | high_priority] [IGNORE]
	[INTO] tbl_name [PARTITION (partition_list)] [(col, ...)]
		{VALUES | VALUE} ({expr | DEFAULT}, ...), (...), ...
        	[ON DUPLICATE KEY UPDATE
            	col = expr
                [, col = expr] ... ] [RETURNING select_expr
                [, selecte_expr ...]] 
                

 

mariadb 공식 홈페이지에서는 이와같이 설명하고있습니다 . 


My Syntax

 

위와같이 설명되어있어서 개발 초보자분( 미투.. ) 쪼끔 .. 난처할 수 있습니다 ㅋㅋㅋㅋㅋㅋㅋㅋ

최대한 쉽게 풀어보겠습니다.

 

INSERT INTO my_tbl (no, name, age, gender ... )
VALUES (1, 'ZZOOO', 24, 'M' ...)
ON DUPLICATE KEY UPDATE
no = '1이 중복이라면 업데이트할 번호', name = 'ZZOOO', 24, 'M' ... 
WHERE '선택적 조건 추가하시면됩니다.'

 

 

한줄씩 살펴보면 , 

 


LINE 1 : my_tbl 에 no,name,age,gender 컬럼에 INSERT를 할 것이다.

LINE 2 : 순차적으로 1 , 'ZZOOO' .. 와 같은값을 넣겠다.

LINE 3 : 중복이면 ? INSERT가 아니라 UPDATE를 해라

LINE 4 : no = ' ?? ' ..  UPDATE 할 값을 다음과 같은 형식에 맞게 나열해주시면 됩니다.

 

다음과 같이 직관적으로 이해할 수 있게 쿼리문이 짜여져있습니다.

 

프로젝트내에서 Duplicate 중복 에러가 발생했다면 에러내용을 꼼꼼히 확인하신 후 ,

DB에 접근하는 Query문이 짜여져있는 Class를 다음과 같은 형식으로 수정하신다면

해결이 될 수도있을것 같습니다. ( 제가 처한 상황과 같은 상황이여야겠지요  ?)

 

이렇게 mariaDB에서 INSERT 또는 UPDATE 시 DUPLICATE KEY 상황을 해결해보았습니다.

도움이되셨길 바라며 포스팅 마치겠습니다. 감사합니다.

 

반응형