如果存在,以原子方式更新行的最佳方法是什么,否则在表中插入新行?
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进行哪些更改以使其成为原子?
答案 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