web-dev-qa-db-ja.com

MySQL、1つのクエリで複数のテーブルを更新

3つのテーブルを更新する関数がありますが、3つのクエリを使用してこれを実行します。良い実践のために、より便利なアプローチを使用したいと思います。

単一のクエリでMySQLの複数のテーブルを更新するにはどうすればよいですか?

112
Adamski

BooksOrdersの2つのテーブルの場合を考えます。場合は、OrdersテーブルでOrder.ID = 1002を使用して特定の順序で書籍の数を増やし、その後、Booksテーブルで同じ数だけ在庫で利用できる書籍の総数を減らす必要があります。

UPDATE Books, Orders
SET Orders.Quantity = Orders.Quantity+2,
    Books.InStock = Books.InStock-2
WHERE
    Books.BookID = Orders.BookID
    AND Orders.OrderID = 1002;
423
Irfan
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ステートメントに変換できます。

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;
60
Wodin

次のような結合を使用して、1つのクエリでもこれを実行できます。

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

もちろん、この1つのクエリを送信するだけです。結合の詳細については、 http://dev.mysql.com/doc/refman/5.0/en/join.html をご覧ください。ここで読むことができる複数のテーブルの更新の順序と制限にはいくつかの制限があります: http://dev.mysql.com/doc/refman/5.0/en/update.html (just ctrl + f "join")。

33
Stephen Searles

複数のクエリを言うとき、次のように複数の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;)

前者はすべて、1つのmySqlQuery呼び出しを使用して実行できます。これが実現したい場合は、次の方法でmySqlQuery関数を呼び出します。

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

これにより、1つのmySqlQuery()呼び出しで3つのクエリすべてが実行されます。

2
code_burgar

これは通常、ストアドプロシージャの目的です。つまり、複数のSQLステートメントをシーケンスに実装します。ロールバックを使用すると、データの一貫性を維持するために、それらが1つの作業単位として処理されるようにすることができます。

0
SteveCav