2010-03-22 137 views
3

我需要更新单个事务中的两个表。各个查询是这个样子:在同一个MySQL事务中更新相关表的方法?

1. INSERT INTO t1 (col1, col2) 
    VALUES (val1, val2) 
    ON DUPLICATE KEY 
     UPDATE col2 = val2; 

如果上面的查询导致插入,然后我需要运行在第二个表如下声明:

2. INSERT INTO t2 (col1, col2) 
    VALUES (val1, val2) 
    ON DUPLICATE KEY 
     UPDATE col2 = col2 + val2; 

否则,

3. UPDATE t2 
     SET col2 = col2 - old_val2 + val2 
    WHERE col1 = val1; 
    -- old_val2 is the value of 
     t1.col2 before it was updated 

现在我首先在t1上运行SELECT,以确定语句1是否会在t1上导致插入或更新。然后我在事务中运行语句1和2和3中的任一个。我可以在一次交易中完成所有这些交易的方式是什么?

的方法,我在想的是:

UPDATE t2, t1 
    set t2.col2 = t2.col2 - t1.col2 
WHERE t1.col1 = t2.col2 
    and t1.col1 = val1; 

INSERT INTO t1 (col1, col2) 
VALUES (val1, val2) 
ON DUPLICATE KEY 
    UPDATE col2 = val2; 

INSERT INTO t2, t1 (t2.col1, t2.col2) 
VALUES (t1.col1, t1.col2) 
ON DUPLICATE KEY 
    UPDATE t2.col2 = t2.col2 + t1.col2 
WHERE t1.col1 = t2.col2 
    and t1.col1 = val1; 

不幸的是,有没有多表INSERT ...对重复密钥更新在MySQL 5.0。我还能做什么?

回答

0

好了,所以我有这个想通了,并说我喜欢做的方式:

UPDATE t2, t1 
    SET t2.col2 = t2.col2 - t1.col2 
WHERE t1.col1 = t2.col2 
    AND t1.col1 = val1; 

INSERT INTO t1 (col1, col2) VALUES (val1, val2) 
ON DUPLICATE KEY UPDATE 
    col2 = val2; 

INSERT INTO t2 (col1, col2) VALUES (val1, val2) 
ON DUPLICATE KEY UPDATE 
    col2 = col2 + VALUES(col2); 

第三个查询可以改写指值在T1像这样:

INSERT INTO t2 (col1, col2) 
    SELECT col1, col2 FROM t1 WHERE col1 = val1 
ON DUPLICATE KEY UPDATE 
    t2.col2 = t2.col2 + VALUES(col2); 
1

如果您执行INSERTUPDATE,则客户端可以获取更改的行数。如何做到这一点取决于您的客户端,但对于多种编程语言,如果成功,则此号码将由INSERT返回。

如果您执行INSERT...ON DUPLICATE KEY UPDATE,您也可以获取此编号,但它不完全符合您的预期。如果您插入/更新单个行,您将收到1作为INSERT的情况下更改的行数,如果是UPDATE,则收到1的行数,即使只有一行发生更改。您可以使用此数字来决定客户端接下来要运行的查询。

不如一笔交易,但至少你摆脱了一个SELECT

+0

那么,我需要做一个SELECT无论如何得到old_val2在语句#3。 – 2010-03-23 04:44:58