자주 마추지는 상황이다.
mysql에서는 다양한 방식으로 위 문제를 해결할 수 있다. 이 중에서 가장 효율적인 방법은 insert into 쿼리문에 on duplicate key clause를 추가하는 것이다.
INSERT INTO table_name (`col1_name`, `col2_name`, `col2_name`, ...)
VALUES
(value11, value12, value13 ,....),
(value21, value22, value23 ,....)
ON DUPLICATE KEY
UPDATE
col_name = special_value1,
col_name = special_value2,
col_name = special_value3
;
INSERT INTO table_name (`col1_name`, `col2_name`, `col2_name`, ...)
VALUES
(value11, value12, value13 ,....),
(value21, value22, value23 ,....)
ON DUPLICATE KEY
UPDATE
col_name = VALUES(`col1_name`),
col_name = VALUES(`col2_name`),
col_name = VALUES(`col3_name`)
;
gorm에서는 OnConflict 객체를 db.Clauses에 추가하는 방식으로 기능을 구현하였다. DoNothing
, DoUpdates
,UpdateAll
으로 원하는 방식을 결정한다.
type OnConflict struct {
Columns []Column
Where Where
TargetWhere Where
OnConstraint string
DoNothing bool
DoUpdates Set
UpdateAll bool
}
claused.OnConflict 객체를 생성하여 쿼리문에 넣어준다.
err := db.Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "PrimaryKeyName"}},
UpdateAll: true,
}).Create(&datas).Error