2010-07-02 7 views
6

Làm cách nào bạn có thể nhận được các hàng chính xác bị ảnh hưởng bởi câu lệnh SQL UPDATE trong MySQL?chọn các hàng bị ảnh hưởng bởi bản cập nhật

Tôi có nhiều khách hàng trên nhiều máy tính có thể cập nhật các hàng trong cùng một bảng dựa trên các mệnh đề WHERE bất kỳ lúc nào và mỗi khách hàng cần thực hiện điều gì đó trong một hệ thống khác cho mỗi hàng mà chúng ảnh hưởng. các mục bị ảnh hưởng phải chính xác và không dễ bị tổn thương trong điều kiện chủng tộc.

Một số cơ sở dữ liệu hỗ trợ UPDATE ... OUTPUT UPDATED.id WHERE ... ví dụ: SQL Server.

Làm cách nào bạn có thể thực hiện việc này UPDATE/SELECT nguyên tử trong MySQL?

(Tôi đã nhìn thấy gợi ý làm các SELECT đầu tiên và sau đó sử dụng các ID như một IN khoản trong UPDATE. Nhưng khách hàng khác có thể chạy cùng SELECT và lấy hàng cùng trong khi các khách hàng đầu tiên được xếp hàng của mình UPDATE vv ?)

Trả lời

2

Sử dụng khóa bàn hoặc giao dịch (nếu được công cụ lưu trữ hỗ trợ) để ngăn điều kiện chủng tộc.

LOCK TABLES tablename; 
SELECT * FROM tablename WHERE x. 
do something else 
UPDATE tablename SET y WHERE x. 
UNLOCK TABLES 
1

Đây là những gì tôi đã sử dụng trước, và có một thể hiện của một người nào khác sử dụng nó here on Stackoverflow:

UPDATE my_table SET 
    id = (SELECT @id := id), 
    <column> = 'value'   
    WHERE <condition>; 

@id sẽ chứa các ID của hàng cập nhật, hoặc NULL nếu n o hàng đã được cập nhật. Điều này sẽ chỉ hoạt động đối với các bản cập nhật một hàng.