INSERT - 중복되는 데이터는 넣지 않기
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를 상황에 맞게 사용하면 되겠다.