2010-12-05 52 views
84

Tôi có chức năng cập nhật ba bảng, nhưng tôi sử dụng ba truy vấn để thực hiện việc này. Tôi muốn sử dụng một cách tiếp cận thuận tiện hơn để thực hành tốt.MySQL, cập nhật nhiều bảng với một truy vấn

Làm cách nào để cập nhật nhiều bảng trong MySQL bằng một truy vấn?

+3

bạn có thể cung cấp một ví dụ về các mã được tạo? Có một chìa khóa chung giữa các bảng? –

+1

Cho phiếu bầu, hãy cân nhắc việc thay đổi câu trả lời được chấp nhận ... –

Trả lời

-16

Bạn có thể thực hiện việc này bằng quy trình được lưu trữ bằng cách kết hợp các câu lệnh UPDATE trong một giao dịch.

+2

Trong khi thủ tục lưu sẵn sẽ hoạt động, mysql hỗ trợ cập nhật với JOIN – DavidScherer

0

Đó thường là các thủ tục được lưu trữ dành cho: để triển khai một số câu lệnh SQL theo trình tự. Sử dụng tính năng rollback, bạn có thể đảm bảo rằng chúng được coi là một đơn vị công việc, tức là chúng được thực hiện hoặc không có thứ gì trong số đó, để giữ cho dữ liệu nhất quán.

+0

nơi tôi sẽ viết thủ tục? bạn có thể vui lòng cung cấp một ví dụ? – Adamski

+0

Up-bình chọn cho giải thích sự cần thiết của atomicity - nó cũng quan trọng để nhận ra rằng bằng cách sử dụng thủ tục lưu trữ không đơn độc đảm bảo tính thống nhất, bạn vẫn cần phải sử dụng giao dịch; tương tự, các giao dịch có thể được thực hiện mà không cần sử dụng một thủ tục lưu sẵn, miễn là chúng được thực hiện trên cùng một kết nối. Trong trường hợp này, việc sử dụng bản cập nhật nhiều bảng thậm chí còn tốt hơn. – Duncan

0

Khi bạn nói nhiều thắc mắc làm bạn có nghĩa là nhiều câu lệnh SQL như trong:

UPDATE table1 SET a=b WHERE c; 
UPDATE table2 SET a=b WHERE d; 
UPDATE table3 SET a=b WHERE e; 

Hoặc nhiều chức năng truy vấn gọi như trong:

mySqlQuery(UPDATE table1 SET a=b WHERE c;) 
mySqlQuery(UPDATE table2 SET a=b WHERE d;) 
mySqlQuery(UPDATE table3 SET a=b WHERE e;) 

Các cựu có thể tất cả được thực hiện bằng một mySqlQuery đơn gọi nếu đó là những gì bạn muốn đạt được, chỉ cần gọi hàm mySqlQuery theo cách sau:

mySqlQuery(UPDATE table1 SET a=b WHERE c; UPDATE table2 SET a=b WHERE d; UPDATE table3 SET a=b WHERE e;) 

Điều này sẽ thực thi cả ba truy vấn với một cuộc gọi mySqlQuery().

+0

vâng, đó là cách tôi có thể đạt được điều này? – Adamski

+0

đã cập nhật câu trả lời của tôi phù hợp với câu hỏi của bạn. –

+0

mySqlQuery() là một hàm tùy chỉnh hoặc trong hàm được xây dựng? Tôi muốn biết thêm về điều này. – Debashis

27

Bạn cũng có thể làm điều này với một truy vấn quá sử dụng một tham gia như sau:

UPDATE table1,table2 SET table1.col=a,table2.col2=b 
WHERE items.id=month.id; 

Và sau đó chỉ cần gửi một truy vấn này, tất nhiên. Bạn có thể đọc thêm về các kết nối tại đây: http://dev.mysql.com/doc/refman/5.0/en/join.html. Ngoài ra còn có một vài hạn chế cho đặt hàng và giới hạn trên nhiều bản cập nhật bảng bạn có thể đọc về đây: http://dev.mysql.com/doc/refman/5.0/en/update.html (chỉ ctrl + f "tham gia").

345

Lấy vỏ của hai bảng, BooksOrders. Trong trường hợp, chúng tôi tăng số lượng sách theo một thứ tự cụ thể với Order.ID = 1002 trong bảng Orders thì chúng tôi cũng cần giảm tổng số sách có sẵn trong kho của chúng tôi bằng cùng một số trong bảng Books.

UPDATE Books, Orders 
SET Orders.Quantity=Orders.Quantity+2, 
Books.InStock=Books.InStock-2 
WHERE Books.BookID=Orders.BookID 
AND Orders.OrderID = 1002; 
+66

Làm thế nào điều này có thể không phải là câu trả lời được chấp nhận. – eddy147

+0

Nếu tôi muốn đưa "LIMIT" vào Truy vấn SQL, tôi có phải nói LIMIT 1 hoặc LIMIT 2 không? – Bluedayz

+1

Lợi thế của việc này so với giao dịch là gì? Cảm ơn! – paulkon

26
UPDATE t1 
INNER JOIN t2 ON t2.t1_id = t1.id 
INNER JOIN t3 ON t2.t3_id = t3.id 
SET t1.a = 'something', 
    t2.b = 42, 
    t3.c = t2.c 
WHERE t1.a = 'blah'; 

Để xem những gì này sẽ cập nhật, bạn có thể chuyển đổi này vào một tuyên bố chọn, ví dụ .:

SELECT t2.t1_id, t2.t3_id, t1.a, t2.b, t2.c AS t2_c, t3.c AS t3_c 
FROM t1 
INNER JOIN t2 ON t2.t1_id = t1.id 
INNER JOIN t3 ON t2.t3_id = t3.id 
WHERE t1.a = 'blah'; 
+7

đây là câu trả lời mạnh mẽ hơn nhiều so với câu trả lời phổ biến và bao gồm các trường hợp phức tạp hơn. – Lizardx

1
UPDATE Table1,Table2 
SET Table1.NAME=Table2.NAME 
WHERE Table1.id=Table2.id ; 
Các vấn đề liên quan