2012-01-06 53 views
16

Tôi có hai bảng cần các giá trị giống hệt nhau cho mục đích không chuẩn hóa.MySql cập nhật hai bảng cùng một lúc

Đây là truy vấn.

bảng đầu tiên

UPDATE Table_One 
SET win = win+1, streak = streak+1, score = score+200 
WHERE userid = 1 AND lid = 1 LIMIT 1 

bảng thứ hai

UPDATE Table_Two 
SET win = win+1, streak = streak+1, score = score+200 
WHERE userid = 1 LIMIT 1 

Như bạn có thể thấy sự khác biệt duy nhất giữa hai bảng là tên và bảng hai của họ không có lĩnh vực lid

Dù sao để kết hợp cả hai bản cập nhật chỉ với một?

Trả lời

32

Có thể có bản cập nhật nhiều bảng, như được mô tả trong tài liệu.

http://dev.mysql.com/doc/refman/5.5/en/update.html

UPDATE Table_One a INNER JOIN Table_Two b ON (a.userid = b.userid) 
SET 
    a.win = a.win+1, a.streak = a.streak+1, a.score = a.score+200, 
    b.win = b.win+1, b.streak = b.streak+1, b.score = b.score+200 
WHERE a.userid = 1 AND a.lid = 1 AND b.userid = 1 

Lưu ý: Multi-bảng không hỗ trợ LIMIT, vì vậy điều này có thể gây ra đau buồn hơn tùy thuộc vào các chi tiết.

Các thủ tục hoặc giao dịch được lưu trữ có thể là giải pháp tốt hơn.

1

Chúng là hai truy vấn riêng biệt và do đó phải được xử lý như vậy. Xin lỗi để nói điều đó, nhưng nếu bạn đang cập nhật hai bảng có dữ liệu giống hệt nhau, có thể có cách tốt hơn để thiết kế cơ sở dữ liệu của bạn. Hãy nhớ giữ cho chương trình của bạn DRY.

Chỉnh sửa: Nên rút lại điều đó; bạn có thể sử dụng nó cho nhiều bảng, nhưng bạn không thể sử dụng ORDER BY hoặc LIMIT.

+0

Tôi hiểu ý bạn là gì, nhưng đối với trường hợp của chúng tôi, chúng tôi đặt lại điểm số cho bảng 1 bao giờ hết. Bảng hai là điểm số cố định, đó là lý do tại sao chúng ta cần hai bảng. Chỉ là tôi có 5 truy vấn cập nhật liên tiếp (tiến trình hàng loạt) và tự hỏi liệu tôi có thể giới hạn các chuyến đi đến db hay không. – user962449

+1

Sẽ không dễ dàng hơn khi thêm trường vào bảng thực hiện cùng một công việc, theo mặc định là '1', nhưng sau đó bạn đặt thành' 0' khi bạn cần "đặt lại" bảng. –

+0

@ user962449 Đến đây trong khi tìm kiếm giải pháp tương tự. Câu trả lời này là sai - và được ghi nhận như vậy bởi tác giả. Bạn nên chấp nhận một câu trả lời tốt hơn nữa. –

8

Nếu có một 1-1 hoặc một đến nhiều mối quan hệ từ Table_One để Table_Two, điều này sẽ làm việc:

UPDATE Table_One T1, Table_Two T2 
SET T1.win = T1.win+1, T1.streak = T1.streak+1, T1.score = T1.score+200, 
    T2.win = T2.win+1, T2.streak = T2.streak+1, T2.score = T2.score+200 
WHERE T1.userid = 1 AND T1.lid = 1 AND T2.userid = T1.userid; 
0

Nếu bạn có thể tham gia các bảng, sau đó bạn có thể tạo ra một cái nhìn của hai bảng, sau đó cập nhật thông qua chế độ xem đó. Trong ví dụ của bạn, có vẻ như userid có thể là một khóa phù hợp.

Khi tạo chế độ xem, bạn cần phải gắn vào following guidelines.

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