2015-08-26 61 views
1

我跑了一些查詢,並得到了一組元組,如((A1,B1),(A2,B2),(A3,B3)....)。 我需要檢查一個元組是否存在於表XYZ(A,B,C)中。如果存在,則更新C否則將(Ax,Bx,C)插入表中。 我嘗試使用下面的查詢,但它不起作用。有沒有其他方法?更新元組是否在集合中,否則插入MySQL

CASE WHEN EXISTS (SELECT * from XYZ as t where (t.A, t.B) in (select u.A, u.B from diff_table as u)) THEN 
THEN UPDATE XYZ as v SET C = 1 WHERE (v.A, v.B) = (t.A, t.B) ELSE 
INSERT INTO XYZ (A,B,C) values (u.A, u.B, 1) END; 
+0

看看到['INSERT ... ON DUPLICATE KEY UPDATE'(https://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html) – Barranka

+0

A和B的組合可以是非唯一的 – arg21

+0

如果它們可以是非唯一的,那麼你有一個問題:你如何找出哪些元組將被更新,哪些不會被更新?除此之外,您將永遠面臨插入重複條目的風險。考慮爲這些字段添加一個唯一索引並使用'insert ... on duplicate key update'。 – Barranka

回答

0

我會做它反過來:

  1. 更新存在
  2. 插入不

或者,如果你有主鍵的那些的那些

  1. 插入所有的默認值爲C(existin摹將被拒絕)
  2. 更新所有
0

你想要的功能是insert . . . on duplicate key insert

首先,你需要一個合適的索引(如果你沒有一個):

create index idx_xyz_a_b on xyz(a, b) 

然後:

insert into xyz(a, b, c) 
    select dt.a, dt.b, 1 
    from diff_table dt 
    on duplicate key update set c = 1; 

順便說一句,如果該值已經存在,你確定你想將它設置爲1而不是增加它?

insert into xyz(a, b, c) 
    select dt.a, dt.b, 1 
    from diff_table dt 
    on duplicate key update set c = c + 1; 
相關問題