5

次のようなクエリがあります

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 句での更新にターゲット テーブル 'connections' を指定することはできません

明らかに、insert into on duplicate update構文内に SELECT 句を含めることはできませんが、2 つのクエリを実行する代わりに、SELECT 句を使用したいと考えています。どうすればこれを行うことができるか教えてもらえますか?

4

3 に答える 3

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

こちらをご覧ください

これがあなたが使用しているバージョンと同じかどうかはわかりません。

于 2013-07-14T11:28:40.057 に答える
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
于 2013-07-14T11:24:48.130 に答える
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
于 2013-07-14T11:24:55.103 に答える