MySQL, update meerdere tabellen met één query

Ik heb een functie die drie tabellen bijwerkt, maar ik gebruik hiervoor drie queries. Ik wil een handiger benadering gebruiken voor goede praktijken.

Hoe kan ik meerdere tabellen in MySQL bijwerken met een enkele query?


Antwoord 1, autoriteit 100%

Neem het geval van twee tabellen, Booksen Orders. Als we het aantal boeken in een bepaalde volgorde verhogen met Order.ID = 1002in de tabel Orders, dan moeten we ook het totale aantal beschikbare boeken in onze voorraad met hetzelfde nummer in de Bookstabel.

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

Antwoord 2, autoriteit 19%

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';

Om te zien wat dit gaat updaten, kun je dit omzetten in een select statement, bijvoorbeeld:

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';

Een voorbeeld met dezelfde tabellen als het andere antwoord:

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;

BEWERKEN:

Laten we voor de lol iets interessanters toevoegen.

Stel dat je een tabel met Booksen een tabel met authorshebt. Je Bookshebben een author_id. Maar toen de database oorspronkelijk werd gemaakt, werden er geen beperkingen voor externe sleutels ingesteld en later zorgde een bug in de front-endcode ervoor dat sommige boeken werden toegevoegd met ongeldige author_ids. Als DBA wil je niet al deze Booksmoeten doornemen om te controleren wat de author_idzou moeten zijn, dus wordt de beslissing genomen dat de gegevensverzamelaars dit zullen oplossen de Booksom naar de juiste authorste wijzen. Maar er zijn te veel boeken om ze allemaal door te nemen en laten we zeggen dat de boeken met een author_iddie overeenkomen met een echte authorcorrect zijn. Alleen degenen die niet-bestaande author_id‘s hebben, zijn ongeldig. Er is al een interface voor de gebruikers om de boekdetails bij te werken en de ontwikkelaars willen dat niet alleen voor dit probleem veranderen. Maar de bestaande interface doet een INNER JOIN authors, dus alle boeken met ongeldige auteurs zijn uitgesloten.

Wat u kunt doen is dit: Voeg een nep-auteurrecord in, zoals “Onbekende auteur”. Werk vervolgens de author_idvan alle slechte records bij om naar de onbekende auteur te verwijzen. Vervolgens kunnen de gegevensverzamelaars zoeken naar alle boeken met de auteur ingesteld op “Onbekende auteur”, de juiste auteur opzoeken en deze corrigeren.

Hoe update je alle slechte gegevens zodat ze naar de onbekende auteur verwijzen? Op deze manier (ervan uitgaande dat de author_idvan de onbekende auteur 99999 is):

UPDATE books
LEFT OUTER JOIN authors ON books.author_id = authors.id
SET books.author_id = 99999
WHERE authors.id IS NULL;

Het bovenstaande zal ook Booksmet een NULLauthor_idupdaten naar de onbekende auteur. Als je dat niet wilt, kun je natuurlijk AND books.author_id IS NOT NULLtoevoegen.


Antwoord 3, autoriteit 8%

Je kunt dit ook met één query doen door een join te gebruiken zoals:

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

En dan natuurlijk deze ene vraag sturen. Je kunt hier meer lezen over deelnames: http://dev.mysql.com /doc/refman/5.0/en/join.html. Er zijn ook een aantal beperkingen voor het bestellen en het beperken van meerdere tafelupdates waarover u hier meer kunt lezen: http://dev.mysql.com/doc/refman/5.0/en/update.html(gewoon ctrl+f “join”).


Antwoord 4

Dat is meestal waar opgeslagen procedures voor zijn: om meerdere SQL-instructies achter elkaar te implementeren. Door rollbacks te gebruiken, kunt u ervoor zorgen dat ze als één werkeenheid worden behandeld, dat wil zeggen dat ze ofwel allemaal worden uitgevoerd of niet worden uitgevoerd, om de gegevens consistent te houden.


Antwoord 5

Als je meerdere zoekopdrachten zegt, bedoel je dan meerdere SQL-instructies zoals in:

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

Of meerdere queryfunctie-aanroepen zoals in:

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

De eerste kan allemaal worden gedaan met een enkele mySqlQuery-aanroep. Als dat is wat u wilt bereiken, roept u gewoon de mySqlQuery-functie op de volgende manier aan:

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

Hiermee worden alle drie de query’s uitgevoerd met één mySqlQuery()-aanroep.


Antwoord 6

Stel dat ik Table1heb met primaire sleutel _iden een booleaanse kolom doc_availability; Table2met refererende sleutel _iden DateTime-kolom last_updateen ik wil de beschikbaarheid van een document wijzigen met _id14 in Table1naar 0 dwz niet beschikbaar en update Table2met de tijdstempel wanneer het document voor het laatst is bijgewerkt. De volgende query zou de taak doen:

UPDATE Table1, Table2 
SET doc_availability = 0, last_update = NOW() 
WHERE Table1._id = Table2._id AND Table1._id = 14

Other episodes