본문 바로가기
  • 포르쉐타고싶다
인포테인먼트 - development/sql

[mysql] INSERT - 중복되는 데이터는 넣지 않기

by 지오ㄴl 2020. 4. 24.

1. 배경

 

어떤 테이블은 데이터가 중복으로 들어가면 안되는 항목을 갖고있다.

 

예를 들어, 

어떤 게시물의 [좋아요] 데이터를 갖고있는 테이블은

 

게시물_idx

유저_idx

 

조합의 칼럼을 갖고있고

 

로직을 간단하게 생각해보면

저 조합이 중복으로 들어가면 안된다는 것을 알 수 있다.

(통신오류로 좋아요를 여러번 눌렀는데 제대로 취소되지 않고 중복으로 좋아요 데이터가 들어가게되면

나중에 유저가 나중에 좋아요를 취소했는데 좋아요 기록이 아직 남아있는 오류 발생)

 

그렇다면 애초에 중 {게시물_idx, 유저_idx}의 조합이 중복으로 insert되는 것을 미연에 방지해야 한다.

 


 

2. 개념

 

크게 두가지의 방법이 있다

1) 매 쿼리문에서 방지
    ->where not exists

2) 컬럼 속성 설정을 통해 방지
    -> (1) 중복되면 안되는 컬럼 조합을
       => primary key
       => unique index 로 설정

    -> (2) 여러 방법
       a. insert ignore
       b. on duplicate key
       c. replace into

 

 

3. 사용방법

 

테이블명 : BOARD_LIKE

- BOARD_LIKE_IDX

- BOARD_IDX

- USER_IDX

 

1) 매 쿼리문에서 방지 - 'where not exists'
INSERT INTO BOARD_LIKE (BOARD_IDX, USER_IDX)
VALUES (11, 13)
WHERE NOT EXISTS 
(SELECT BOARD_LIKE_IDX FROM BOARD_LIKE WHERE BOARD_IDX = 11 AND USER_IDX = 13)

 

2) 컬럼 속성 설정

 

(1) 중복되면 안되는 컬럼 조합을 PRIMARY KEY 혹은 UNIQUE INDEX로 설정한다.

- PRIMARY KEY

ALTER TABLE BOARD_LIKE ADD PRIMARY KEY (BOARD_IDX, USER_IDX)

 

- UNIQUE INDEX

ALTER TABLE BOARD_LIKE ADD UNIQUE INDEX (BOARD_IDX, USER_IDX)

 

(2) 쿼리문 설정

 

 a. insert ignore

INSERT IGNORE INTO BOARD_LIKE (BOARD_IDX, USER_IDX)

VALUES (11, 13)

 

- 중복되면 insert하지않고 무시한다

 

 

  b. on duplicate key

INSERT INTO BOARD_LIKE (BOARD_IDX, USER_IDX)
VALUES (11, 13)
ON DUPLICATE KEY [그 상황에 적용할 쿼리문]

 

- 중복된 상황에 대한 또다른 처리를 할 수 있다

 

  c. replace into

REPLACE INTO BOARD_LIKE (BOARD_IDX, USER_IDX)
VALUES (11, 13)

 

- 원래 있던 데이터를 삭제하고 새로 insert한다

 

 

a, b, c를 상황에 맞게 사용하면 되겠다.

반응형

댓글