2017-03-14 10 views
0

行がアトミックに更新されている場合は、どのような方法が最適ですか?そうでない場合は、新しい行をテーブルに挿入しますか?Atomic Upsert MySQL

次の例があるとします。

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

ので、私はT-SQLタグを削除:

は、ここでは、この声明についての私の長い答えを参照してください。 –

答えて

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は、主キーまたは一意として宣言する必要があり、作業には、このためにそれを追加する必要があります。

+0

whereステートメントがpk用でない場合はどうすればいいですか? – Max

+0

@ Max。 。 。ユニークでなければなりません。それ以外の場合は、更新する行を知る方法を教えてください。例えば、 –

+0

。私たちは、複合キーを持つことができます - e.g.CREATE TABLEテスト( ID整数、 ID2の整数、 ヴァルVARCHAR(255) ) その後、我々は、idとID2上のvalを更新することになります。 – Max