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를 상황에 맞게 사용하면 되겠다.

0
0
이 글을 페이스북으로 퍼가기 이 글을 트위터로 퍼가기 이 글을 카카오스토리로 퍼가기 이 글을 밴드로 퍼가기

Database

번호 제목 글쓴이 날짜 조회수
10 [Linux] CentOS 7 MariaDB 10.5 버전으로 업데이트 하는 방법 관리자 11-14 57
9 MySQL phpMyAdmin 에서 작업할 DB의 모든 MyISAM 테이블을 InnoDB 로 바꾸는 방법 관리자 11-04 64
8 INSERT - 중복되는 데이터는 넣지 않기 관리자 10-24 65
7 mysql 한글, 영문, 숫자 순으로 정렬 관리자 07-13 189
6 MariaDB 메모리 누수 잡기 ( Memory Leak Issue ) - jemalloc 관리자 06-19 772
5 [MySQL] REGEXP_REPLACE 한글, 영문, 특수문자, 숫자 제거 관리자 01-19 1,278
4 [mysql]innodb 메모리별 설정값 예시 관리자 10-13 888
3 MySQL 중복 레코드 관리 방법 관리자 09-10 569
2 sleep session 정리하기 관리자 07-31 500
1 MYSQL 8 에서 PASSWORD 함수 사용하기 관리자 04-18 1,163