티스토리 뷰

반응형

insert + update를 합친 upsert를 사용하기 위해 아래와 같이 진행했다.

 

 

1. unique index 지정

: PK를 사용하여 upsert를 진행하려는 것이 아니기 때문에 원하는 컬럼 조합으로 index를 생성

 

추가 예) phoneNumber와 nickname을 합쳐 하나의 unique index로 사용

User.init({
    userId: {
        type: DataTypes.BIGINT.UNSIGNED,
        primaryKey: true,
        autoIncrement: true,
    },
    phoneNumber: {
        type: DataTypes.STRING,
    },
    nickname: {
        type: DataTypes.STRING,
    },
    point: {
    	type: DataTypes.INTEGER,
    }
}, {
    indexes: [
        {
            unique: true,
            fields: ['phoneNumber', 'nickname']
        }
    ]
})

 

 

2. upsert 진행

// 전달받은 request 값 (임의)
let param = request.param;

let [user, created] = await USER.upsert({
	phoneNumber: param.phoneNumber,
    	nickname: param.nickname,
    	point: param.point,
})

 

이렇게 upsert를 진행하면 다음과 같은 쿼리가 나온다.

 

INSERT INTO `user` (`phoneNumber`,`nickname`,`point`,`createdAt`) 
	VALUES (?,?,?,?) 
ON DUPLICATE KEY UPDATE 
    `phoneNumber`=VALUES(`phoneNumber`),
    `nickname`=VALUES(`nickname`),
    `point`=VALUES(`point`);

 

 

3. 동작 내용

: 위 쿼리 내용 중 "ON DUPLICATE KEY UPDATE"는 데이터를 insert 했을 때, PK 혹은 UNIQUE KEY가 중복될 경우 지정 데이터만 update 하는 명령어이다. (물론 중복되지 않으면 insert가 실행되게 된다.)

 

현재 예시 내용을 가지고 보면 phoneNumber와 nickname이 함께 unique index로 사용되기 때문에 해당 로우의 point 컬럼 값만 전달받은 데이터로 update 되게 된다.

 

 

 

 

 

 

반응형