原子Upsert MySQL

时间:2017-03-14 01:18:11

标签: mysql sql database

如果存在,以原子方式更新行的最佳方法是什么,否则在表中插入新行?

e.g。说我们在下面有这个例子。

CREATE TABLE Test(
id integer,
val varchar(255)
)

DELIMITER $$

DROP PROCEDURE IF EXISTS `TestUpsert` $$
CREATE PROCEDURE `TestUpsert` (in value1 varchar(255), in id1 int)
BEGIN
    IF EXISTS(Select 1 from Test where id=id1) THEN
        UPDATE Test set val  = value1 where id = id1;
    ELSE
        insert into Test(id, val) VALUES (id1, value1);
    END IF;

END $$

DELIMITER ;

我们可以对TestUpsert进行哪些更改以使其成为原子?

2 个答案:

答案 0 :(得分:1)

使用on duplicate key update

CREATE PROCEDURE `TestUpsert` (
    in in_value varchar(255),
    in in_id int
)
BEGIN
    insert into test(id, val)
        values (in_id, in_val)
        on duplicate key update val = in_val;
END $$

我应该补充一点,为此,test.id必须被声明为主键或唯一。

答案 1 :(得分:0)

我建议你阅读INSERT ... ON DUPLICATE KEY UPDATE

请在此处查看关于此声明的冗长答案:https://stackoverflow.com/a/548570/20860