2013-07-14 54 views
5

Tôi có một truy vấn như sauMySQL INSERT trên CẬP NHẬT khóa trùng lặp với 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 

nào ném được lỗi sau

1093 - Bạn không thể chỉ 'kết nối' mục tiêu bảng để cập nhật trong mệnh đề FROM

Rõ ràng là tôi không thể có mệnh đề SELECT trong cú pháp insert into on duplicate update, nhưng tôi thực sự muốn thực hiện điều đó thay vì có 2 truy vấn đang chạy. Bất cứ ai có thể cho tôi biết làm thế nào tôi có thể làm điều này?

+0

bản sao có thể có của [** Cách INSERT INTO ... CHỌN với KEY DUPLICATE KEY **] (http://stackoverflow.com/a/14701250/342740) – Prix

+0

@prix Tôi không thấy cách này có thể áp dụng cho vấn đề của tôi, tôi chỉ có 1 bảng –

+0

Bạn không cần 2 bảng, tuy nhiên truy vấn của bạn là sai và bạn có thể thấy từ ví dụ đó là gì. – Prix

Trả lời

4

Hãy thử như thay vì điều này:

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 

Vấn đề này dường như do một lỗi trong phiên bản 4.1.7 mysql trong đó nêu rằng

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

xem Here

Không chắc chắn đây có phải là phiên bản bạn đang sử dụng không.

1

thử

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

Các mã sau này bên trong truy vấn của bạn:

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

thực sự kết quả trong một bảng và không phải là một giá trị duy nhất. Đối với một nỗ lực thành công, hãy thử này:

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

Làm thế nào đến kết quả truy vấn đầu tiên trong một bảng khi tôi chỉ chọn một cột duy nhất và giới hạn 1 kết quả? Ngoài ra, bạn có thể giải thích tại sao tôi phải có tất cả các giá trị như là một kết quả được đặt từ một mệnh đề lựa chọn thay vì cách tôi đã viết nó? –

+0

Ngoài ra, điều này dường như không thêm hàng mới nếu các điều kiện không được đáp ứng: / –

Các vấn đề liên quan