ฉันมีฟังก์ชันที่อัปเดตตารางสามตาราง แต่ฉันใช้แบบสอบถามสามรายการเพื่อดำเนินการนี้ ฉันต้องการใช้แนวทางที่สะดวกกว่าในการปฏิบัติที่ดี
ฉันจะอัปเดตหลายตารางใน MySQL ด้วยแบบสอบถามเดียวได้อย่างไร
ฉันมีฟังก์ชันที่อัปเดตตารางสามตาราง แต่ฉันใช้แบบสอบถามสามรายการเพื่อดำเนินการนี้ ฉันต้องการใช้แนวทางที่สะดวกกว่าในการปฏิบัติที่ดี
ฉันจะอัปเดตหลายตารางใน MySQL ด้วยแบบสอบถามเดียวได้อย่างไร
คำตอบ:
ใช้กรณีของตารางสองตารางBooks
และOrders
. ในกรณีที่เราเพิ่มจำนวนหนังสือตามลำดับที่ระบุOrder.ID = 1002
ในOrders
ตารางจากนั้นเราจำเป็นต้องลดจำนวนหนังสือทั้งหมดที่มีอยู่ในสต็อกของเราด้วยจำนวนเดียวกันในBooks
ตาราง
UPDATE Books, Orders
SET Orders.Quantity = Orders.Quantity + 2,
Books.InStock = Books.InStock - 2
WHERE
Books.BookID = Orders.BookID
AND Orders.OrderID = 1002;
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';
หากต้องการดูว่ากำลังจะอัปเดตอะไรคุณสามารถแปลงสิ่งนี้เป็นคำสั่งที่เลือกได้เช่น:
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';
ตัวอย่างที่ใช้ตารางเดียวกันกับคำตอบอื่น ๆ :
SELECT Books.BookID, Orders.OrderID,
Orders.Quantity AS CurrentQuantity,
Orders.Quantity + 2 AS NewQuantity,
Books.InStock AS CurrentStock,
Books.InStock - 2 AS NewStock
FROM Books
INNER JOIN Orders ON Books.BookID = Orders.BookID
WHERE Orders.OrderID = 1002;
UPDATE Books
INNER JOIN Orders ON Books.BookID = Orders.BookID
SET Orders.Quantity = Orders.Quantity + 2,
Books.InStock = Books.InStock - 2
WHERE Orders.OrderID = 1002;
แก้ไข:
เพื่อความสนุกสนานขอเพิ่มสิ่งที่น่าสนใจอีกเล็กน้อย
สมมติว่าคุณมีตารางของและโต๊ะของbooks
authors
ของคุณbooks
มีauthor_id
ไฟล์. แต่เมื่อฐานข้อมูลถูกสร้างขึ้นในตอนแรกไม่มีการตั้งค่าข้อ จำกัด ของคีย์ต่างประเทศและต่อมาข้อผิดพลาดในโค้ดส่วนหน้าทำให้หนังสือบางเล่มถูกเพิ่มด้วยauthor_id
s ที่ไม่ถูกต้อง ในฐานะที่เป็น DBA ที่คุณไม่ต้องการที่จะต้องไปผ่านสิ่งเหล่านี้books
เพื่อตรวจสอบว่าสิ่งที่author_id
ควรจะเป็นเพื่อการตัดสินใจที่จะทำว่า capturers ข้อมูลจะแก้ไขไปยังจุดไปทางขวาbooks
authors
แต่มีหนังสือจำนวนมากเกินไปที่จะอ่านแต่ละเล่มและสมมติว่าคุณรู้ว่าหนังสือที่มีauthor_id
ที่สอดคล้องกับจริงauthor
นั้นถูกต้อง มันเป็นเพียงสิ่งที่ไม่มีอยู่จริงauthor_id
s ที่ไม่ถูกต้อง มีอินเทอร์เฟซสำหรับผู้ใช้ในการอัปเดตรายละเอียดหนังสืออยู่แล้วและนักพัฒนาไม่ต้องการเปลี่ยนแปลงเพียงเพื่อปัญหานี้ แต่อินเทอร์เฟซที่มีอยู่ทำหน้าที่INNER JOIN authors
ได้ดังนั้นหนังสือทั้งหมดที่มีผู้แต่งไม่ถูกต้องจะถูกยกเว้น
สิ่งที่ทำได้คือใส่บันทึกผู้แต่งปลอมเช่น "Unknown author" จากนั้นอัปเดตauthor_id
บันทึกที่ไม่ดีทั้งหมดเพื่อชี้ไปที่ผู้เขียนที่ไม่รู้จัก จากนั้นตัวจับข้อมูลสามารถค้นหาหนังสือทั้งหมดโดยตั้งค่าผู้เขียนเป็น "ผู้เขียนที่ไม่รู้จัก" ค้นหาผู้แต่งที่ถูกต้องและแก้ไข
คุณจะอัปเดตบันทึกที่ไม่ดีทั้งหมดให้ชี้ไปที่ผู้เขียนที่ไม่รู้จักได้อย่างไร เช่นนี้ (สมมติว่าผู้เขียนไม่ทราบชื่อauthor_id
คือ 99999):
UPDATE books
LEFT OUTER JOIN authors ON books.author_id = authors.id
SET books.author_id = 99999
WHERE authors.id IS NULL;
ข้างต้นจะมีการอัปเดตbooks
ที่มีNULL
author_id
ถึงผู้เขียนที่ไม่รู้จัก หากคุณไม่ต้องการสิ่งนั้นคุณสามารถเพิ่มAND books.author_id IS NOT NULL
ได้
คุณสามารถทำได้ด้วยแบบสอบถามเดียวเช่นกันโดยใช้การเข้าร่วมดังนี้:
UPDATE table1,table2 SET table1.col=a,table2.col2=b
WHERE items.id=month.id;
จากนั้นก็ส่งแบบสอบถามนี้แน่นอน คุณสามารถอ่านเพิ่มเติมเกี่ยวกับการเข้าร่วมที่นี่: http://dev.mysql.com/doc/refman/5.0/en/join.html นอกจากนี้ยังมีข้อ จำกัด บางประการสำหรับการสั่งซื้อและการ จำกัด การอัปเดตตารางหลายรายการที่คุณสามารถอ่านได้ที่นี่: http://dev.mysql.com/doc/refman/5.0/th/update.html (เพียง ctrl + f "join")
โดยปกติขั้นตอนการจัดเก็บนั้นมีไว้สำหรับ: เพื่อใช้คำสั่ง SQL หลายคำสั่งตามลำดับ การใช้การย้อนกลับคุณสามารถมั่นใจได้ว่าจะถือว่าเป็นหน่วยงานเดียวกล่าวคือดำเนินการทั้งหมดหรือไม่มีเลยเพื่อให้ข้อมูลมีความสอดคล้องกัน
เมื่อคุณพูดหลายแบบสอบถามคุณหมายถึงคำสั่ง SQL หลายคำใน:
UPDATE table1 SET a=b WHERE c;
UPDATE table2 SET a=b WHERE d;
UPDATE table3 SET a=b WHERE e;
หรือเรียกใช้ฟังก์ชันการสืบค้นหลายรายการในรูปแบบ:
mySqlQuery(UPDATE table1 SET a=b WHERE c;)
mySqlQuery(UPDATE table2 SET a=b WHERE d;)
mySqlQuery(UPDATE table3 SET a=b WHERE e;)
ก่อนหน้านี้สามารถทำได้โดยใช้การเรียก mySqlQuery เดียวหากนั่นคือสิ่งที่คุณต้องการบรรลุเพียงแค่เรียกใช้ฟังก์ชัน mySqlQuery ในลักษณะต่อไปนี้:
mySqlQuery(UPDATE table1 SET a=b WHERE c; UPDATE table2 SET a=b WHERE d; UPDATE table3 SET a=b WHERE e;)
สิ่งนี้จะดำเนินการทั้งสามแบบสอบถามด้วยการเรียก mySqlQuery () ครั้งเดียว