2010-03-22 31 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