728x90
반응형
INSERT ... ON DUPLICATE KEY UPDATE 는 INSERT 문의 MariaDB/Mysql 확장문으로,
중복된 고유 키 또는 기본 키를 찾으면 INSERT 대신 UPDATE를 실행한다.
둘 이상의 고유 인덱스가 일치하면 첫 번째 인덱스만 업데이트 된다.
따라서 둘 이상의 고유 인덱스가 있는 테이블에서는 이 문을 사용하지 않는 것이 좋다.
예시
CREATE TABLE food (id INT PRIMARY KEY, menu VARCHAR(30));
INSERT INTO food VALUES (1,'라면'), (2,'쫄면'), (3,'밀면');
기존의 키가 없다면 명령문이 그냥 insert 로 실행된다.
INSERT INTO food VALUES (4,'김밥')
ON DUPLICATE KEY UPDATE menu='김밥';
SELECT * FROM food;

위의 상태에서 그냥 inset 문을 입력하면?
INSERT INTO food VALUES (1,'냉면');
1번의 primary key가 존재한다고 실행되지 않는다.
그렇지만
아래처럼 입력하면 1번 키에 값이 입력이 된다.
INSERT INTO food VALUES (1,'소주')
ON DUPLICATE KEY UPDATE menu='소주';

두개 이상의 행이 영향을 받을 때
유니크 키를 추가
ALTER TABLE food ADD id2 INT;
UPDATE food SET id2=id+10;
ALTER TABLE food ADD UNIQUE KEY(id2);

이 상태에서
INSERT INTO food VALUES (2,'맥주',13)
ON DUPLICATE KEY UPDATE menu='맥주';
이런식으로 primary key 와 unique key가 해당되는 2개의 행이 영향을 받게 된다면
아래처럼 둘중에 하나의 컬럼만 영향을 받게 되니 주의하자.
그냥 두개의 행에 영향을 받게 하지 말자.

728x90
반응형
'DB > MariaDB' 카테고리의 다른 글
| 데이터 정규화 (0) | 2024.03.22 |
|---|---|
| IFNULL (0) | 2022.02.17 |
| 데이터베이스 사용자 비밀번호 변경 & 권한 관리 (0) | 2022.02.11 |
| 특정 DB 내에 존재하는 모든 컬럼 목록을 한번에 조회 (0) | 2022.01.20 |
| 더미데이터 넣기 (0) | 2021.11.12 |
| BINARY (대소문자 구분) (0) | 2021.11.12 |