2010-04-26 46 views
144

Tôi có truy vấn sql mà tôi muốn chèn nhiều hàng trong một truy vấn. vì vậy tôi đã sử dụng một cái gì đó như:MySQL VỀ CẬP NHẬT KEY DUPLICATE cho nhiều hàng chèn trong truy vấn đơn

$sql = "INSERT INTO beautiful (name, age) 
    VALUES 
    ('Helen', 24), 
    ('Katrina', 21), 
    ('Samia', 22), 
    ('Hui Ling', 25), 
    ('Yumie', 29)"; 

mysql_query($sql, $conn); 

Vấn đề là khi tôi thực hiện truy vấn này, tôi muốn kiểm tra xem một phím UNIQUE (không phải là khóa CHÍNH), ví dụ. 'tên' trong trường hợp trên, nên được kiểm tra và nếu một 'tên' đã tồn tại, toàn bộ hàng tương ứng phải được cập nhật nếu không chèn vào.

Ví dụ: dưới đây, nếu 'Katrina' đã có trong cơ sở dữ liệu, toàn bộ hàng, không phân biệt số lượng trường, sẽ được cập nhật. Một lần nữa nếu không có 'Samia', thì hàng sẽ được chèn vào.

Tôi nghĩ của việc sử dụng:

INSERT INTO beautiful (name, age) 
     VALUES 
     ('Helen', 24), 
     ('Katrina', 21), 
     ('Samia', 22), 
     ('Hui Ling', 25), 
     ('Yumie', 29) ON DUPLICATE KEY UPDATE 

Đây là cái bẫy. Tôi đã bị mắc kẹt và bối rối làm thế nào để tiến hành. Tôi có nhiều hàng để chèn/cập nhật tại một thời điểm. Xin vui lòng cho tôi hướng đi. Cảm ơn.

Trả lời

338

Sử dụng từ khóa VALUES để tham chiếu đến các giá trị mới (xem documentation).

INSERT INTO beautiful (name, age) 
    VALUES 
    ('Helen', 24), 
    ('Katrina', 21), 
    ('Samia', 22), 
    ('Hui Ling', 25), 
    ('Yumie', 29) 
ON DUPLICATE KEY UPDATE 
    age = VALUES(age), 
    ... 
+6

Cảm ơn một tấn. Đó là chính xác những gì tôi muốn .... Cảm ơn một lần nữa ... – Prashant

+10

** đẹp **, chính xác những gì tôi cần. * heh, xem tôi đã làm gì ở đó? * –

+0

Điều gì xảy ra nếu chúng ta cần đưa câu lệnh IF vào CẬP NHẬT có điều kiện khác nhau cho mỗi hàng? – logic

-1

Bạn có thể sử dụng Replace thay vì INSERT ... ON UPDATE DUPLICATE KEY UPDATE.

+16

Có nhưng sử dụng THAY THẾ hàng cũ sẽ bị xóa trước khi hàng mới được chèn vào. Tôi muốn giữ lại hàng cũ để duy trì id chính. – Prashant

+2

Tôi không nhận ra rằng việc giữ lại PK cũ là quan trọng đối với bạn ... Chắc chắn, REPLACE sẽ không hoạt động trong trường hợp này ... – a1ex07

+0

Nếu bạn không quan tâm đến PK, như trong trường hợp của tôi, công trình này hoàn hảo. – MLeFevre

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