2013-07-14 56 views
5

我有一個像下面MySQL在重複鍵更新插入與SELECT

INSERT INTO connections (`c_id`,`in`,`out`,`ip`,`userID`) 
VALUES ( 
    ( 
     SELECT c_id 
     FROM connections 
     WHERE (a bunch of conditions) 
     ORDER BY c_id DESC LIMIT 1 

    ), 
    '1373799802', 
    0, 
    INET_ATON('127.0.0.1'), 
    4 

) 
ON DUPLICATE KEY UPDATE `out` = 1 

會拋出以下錯誤

1093查詢 - 您不能指定目標表「連接」的更新在FROM子句中

很明顯,我不能在insert into on duplicate update語法中有SELECT子句,但我真的寧願這樣做,而不是運行2個查詢。誰能告訴我我該怎麼做?

+0

可能重複[**如何插入...選擇與ON DUPLICATE KEY **](http://stackoverflow.com/a/14701250/342740) – Prix

+0

@prix我不明白這是怎麼回事適用於我的問題,我只有1個表 –

+0

然而,你不需要2個表,但是你的查詢是錯誤的,你可以從示例中看到什麼是。 – Prix

回答

4

嘗試這樣來代替:

INSERT INTO connections (`c_id`,`in`,`out`,`ip`,`userID`) 
VALUES ( 
    ( 
SELECT p.c_id 
     FROM (select * from connections) p 
     WHERE (a bunch of conditions) 
     ORDER BY p.c_id DESC LIMIT 1 

    ), 
    '1373799802', 
    0, 
    INET_ATON('127.0.0.1'), 
    4 

) 
ON DUPLICATE KEY UPDATE `out` = 1 

這個問題似乎是由於在MySQL 4.1.7版本其中指出

you can't update the same table which you use in the SELECT part 

錯誤請參閱Here

不確定這是否與您使用的版本相同。

1

試試這個

INSERT INTO connections (`c_id`,`in`,`out`,`ip`,`userID`) 
    SELECT c_id ,'1373799802', 0, INET_ATON('127.0.0.1'),4 
    FROM connections 
    WHERE (a bunch of conditions) 
    ORDER BY c_id DESC LIMIT 1 

    ON DUPLICATE KEY UPDATE `out` = 1 
1

下面的代碼查詢裏面:

SELECT c_id 
FROM connections 
WHERE (a bunch of conditions) 
ORDER BY c_id DESC 
LIMIT 1 

實際上導致在一個表中,而不是單個值。對於一個成功的嘗試,試試這個:

INSERT INTO connections (`c_id`,`in`,`out`,`ip`,`userID`) 
    SELECT c_id, 
      '1373799802', 
      0, 
      INET_ATON('127.0.0.1'), 
      4 
    FROM connections 
    WHERE (a bunch of conditions) 
    ORDER BY c_id DESC LIMIT 1 
ON DUPLICATE KEY 
UPDATE `out` = 1 
+0

當我僅選擇一列並且結果爲1時,第一個查詢如何產生表格?你也可以解釋爲什麼我必須把所有的值作爲select子句的結果集而不是我寫的結果嗎? –

+0

另外,如果條件不符合,這似乎不會添加新行:/ –