2011-10-01 35 views
5

Tôi đã nhìn thấy những điều sau đây (bằng cách sử dụng tùy chọn VALUES):Tôi có thể sử dụng ON CẬP NHẬT KEY DUPLICATE với truy vấn INSERT bằng tùy chọn SET không?

$query = "INSERT INTO $table (column-1, column-2, column-3) VALUES ('value-1', 'value-2', 'value-3') ON DUPLICATE KEY UPDATE SET column1 = value1, column2 = value2, column3 = value3, ID=LAST_INSERT_ID(ID)"; 

... nhưng tôi không thể hình dung làm thế nào để thêm ON DUPLICATE CẬP NHẬT KEY với những gì tôi đang sử dụng:

$query = "INSERT INTO $table SET 
    column-1 ='value-1', 
    column-2 ='value-2', 
    column-3 ='value-3' 
"; 

ví dụ :, pseudo-code

$query = "INSERT INTO $table SET 
    column-1 ='value-1', 
    column-2 ='value-2', 
    column-3 ='value-3' 
    ON DUPLICATE KEY UPDATE SET 
    column1 = value1, 
    column2 = value2, 
    column3 = value3, 
    $id=LAST_INSERT_ID(id)"; 
    $my_id = mysql_insert_id(); 
"; 

tôi sẽ tìm thấy sau này dễ đọc hơn. Sẽ đánh giá cao làm rõ, không tìm thấy một ví dụ trong hướng dẫn sử dụng.

cổ vũ

Trả lời

14

Tôi đã sử dụng ON DUPLICATE KEY UPDATE rất nhiều. Đối với một số trường hợp, tiện ích mở rộng SQL không chuẩn của nó thực sự đáng để sử dụng.

Trước tiên, bạn cần đảm bảo rằng bạn có một ràng buộc khóa duy nhất tại chỗ. Chức năng ON DUPLICATE KEY UPDATE chỉ khởi động nếu có sự vi phạm chính duy nhất.

Dưới đây là một định dạng thường được sử dụng: "Cập nhật column1 với giá trị mà có thể đã được đưa vào nếu truy vấn đã không nhấn vi phạm khóa trùng lặp"

$query = "INSERT INTO $table (column1, column2, column3) 
VALUES ('value-1', 'value-2', 'value-3') 
ON DUPLICATE KEY UPDATE 
column1 = values(column1), 
column2 = values(column2), 
column3 = values(column3);" 

column1 = values(column1) phương tiện Nói cách khác, nó chỉ có nghĩa là cập nhật column1 đến những gì nó đã có được chèn làm việc.

Nhìn vào mã này, có vẻ như bạn không cập nhật tất cả ba cột bạn đang cố gắng chèn. Cột nào có ràng buộc duy nhất trên cột?

EDIT: Sửa đổi dựa trên định dạng 'SET' của câu lệnh chèn mysql cho mỗi câu hỏi từ OP.

Về cơ bản để sử dụng ON DUPLICATE KEY UPDATE, bạn chỉ cần viết câu lệnh chèn như bình thường, nhưng thêm mệnh đề ON DUPLICATE KEY UPDATE được gắn vào cuối. Tôi tin rằng nó sẽ hoạt động như sau:

INSERT INTO $table 
    set column1 = 'value-1', 
     column2 = 'value-2', 
     column3 = 'value-3' 
ON DUPLICATE KEY UPDATE 
    column1 = values(column1), 
    column2 = values(column2), 
    column3 = values(column3); 

Một lần nữa, một trong các cột bạn chèn phải có chỉ mục duy nhất (hoặc kết hợp các cột). Điều đó có thể là do một trong số đó là khóa chính hoặc vì có một chỉ mục duy nhất trên bảng.

+0

Cảm ơn Kevin. Cột ID của tôi là Khóa chính và có Chỉ mục duy nhất. Tôi tin rằng tôi hiểu làm thế nào ON DUPLICATE KEY hoạt động, nhưng vấn đề của tôi là thêm nó vào một cú pháp INSERT khác, một sử dụng SET như trái ngược với VALUES. Tôi muốn xem một ví dụ về cú pháp đó nếu nó có thể thực hiện được. – shecky

+0

và chỉ cần làm rõ: Tôi muốn sử dụng ON TUYÊN BỐ CHO TUYẾN ĐỔI KHẨN CẤP để ngăn lừa đảo làm mới, mặc dù tôi đang sử dụng tiêu đề để chuyển hướng người dùng đến trang kết quả nhưng tôi không thể ngăn người dùng quay lại và gửi lại .. Vì vậy, tôi nghĩ tôi sẽ CẬP NHẬT tất cả các trường nếu ID tồn tại – shecky

+0

Tôi đã sửa đổi ví dụ để sử dụng định dạng bạn đang hỏi, ít nhất tôi nghĩ rằng tôi đã làm! –

1
+0

Cảm ơn Kemal. Thay thế cũng có vẻ giống như một phương pháp thích hợp tuy nhiên sự khác biệt giữa REPLACE & ON CẬP NHẬT KEY UPDATE chưa hoàn toàn rõ ràng với tôi. Tôi sẽ đọc trên REPLACE. – shecky

+0

P. sự hiểu biết của tôi là REPLACE có khả năng tiềm ẩn với việc lập chỉ mục theo cách không mong muốn vì vậy tôi sẽ cố gắng thực hiện công việc ON DUPLICATE KEY UPDATE. Thx một lần nữa Kemal – shecky

+0

xem chi tiết về thay thế ở đây http://stackoverflow.com/questions/4205181/insert-to-table-or-update-if-exists-mysql – frazras

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