MySQLUPDATEマルチテーブルアソシエーションの更新

MySQLは、複数のテーブルに基づいてデータをクエリおよび更新できます。マルチテーブルのUPDATE操作の場合は、注意が必要です。SELECTステートメントを使用して、更新する前に、更新されたデータが期待と一致しているかどうかをクエリおよび確認することをお勧めします。
以下に2つのテーブルを作成します。1つは製品価格フィールド価格を含む製品情報を格納するために使用される製品テーブルで、もう1つはproduct_priceテーブルです。次に、product_priceテーブルの価格フィールド価格をproductテーブルの価格フィールド価格の80%に更新する必要があります。
操作の前に、2つのテーブルのデータを別々に確認してください。SQLステートメントと実行結果は次のとおりです。

mysql> SELECT * FROM product;
+ ---- + ----------- + ----------------------- +- ------ + ---------- +
| id | productid | productname | price | isdelete |
+ ---- + ----------- + --- -------------------- + ------- + ---------- +
| 1 | 1001 | C言語中国語ネットJavaチュートリアル| 100 | 0 |
| 2 | 1002 | C言語中国ネットワークMySQLチュートリアル| 110 | 0 |
| 3 | 1003 | C言語中国ネットワークPythonチュートリアル| 120 | 0 |
| 4 | 1004 | C言語中国ネットワークC言語チュートリアル| 150 | 0 |
| 5 | 1005 | C言語の中国語ウェブサイトGoLangチュートリアル| 160 | 0 |
+ ---- + ----------- + ----------- ------------ + ------- + ---------- +
5行セット(0.02秒)

mysql> SELECT * FROM product_price;
+ ---- + ----------- + ------- +
| id | productid | 価格|
+ ---- + ----------- + ------- +
| 1 | 1001 | NULL |
| 2 | 1002 | NULL |
| 3 | 1003 | NULL |
| 4 | 1004 | NULL |
| 5 | 1005 | NULL |
+ ---- + ----------- + ------- +
5行セット(0.01秒)

以下は、MySQLマルチテーブルアップデートを実際に作成するいくつかの異なる方法です。さまざまなSQLステートメントを実行し、SQLステートメントの実行後にテーブル内のデータの変化を注意深く観察します。複数テーブルの共同更新の使用法を理解するのは簡単です。

1.UPDATEを使用します

MySQLでは、「UPDATE table1 t1、table2、...、table n」を使用して、複数のテーブルを更新できます。SQLステートメントと実行結果は次のとおりです。

mysql> UPDATE product p、product_price pp SET pp.price = p.price * 0.8 WHERE p.productid = pp.productId; 
クエリOK、影響を受ける5行(0.02秒)
一致する行:5変更:5警告:0 

mysql> SELECT * FROM product_price; 
+ ---- + ----------- + ------- + 
| id | productid | 価格| 
+ ---- + ----------- + ------- + 
| 1 | 1001 | 80 | 
| 2 | 1002 | 88 | 
| 3 | 1003 | 96 | 
| 4 | 1004 | 120 | 
| 5 | 1005 | 128 | 
+ ---- + ----------- + ------- + 
5行セット(0.00秒)

2.内部結合を介して

もう1つの方法は、INNERJOINを使用して複数のテーブルを更新することです。SQLステートメントは次のとおりです。

mysql> UPDATE product p INNER JOIN product_price pp ON p.productid = pp.productid SET pp.price = p.price * 0.8; 
クエリOK、影響を受ける5行(0.09秒)
一致する行:5変更:5警告:0 

mysql> SELECT * FROM product_price; 
+ ---- + ----------- + ------- + 
| id | productid | 価格| 
+ ---- + ----------- + ------- + 
| 1 | 1001 | 80 | 
| 2 | 1002 | 88 | 
| 3 | 1003 | 96 | 
| 4 | 1004 | 120 | 
| 5 | 1005 | 128 | 
+ ---- + ----------- + ------- + 
5行セット(0.00秒)

3. LEFTJOIN経由

LEFT JOINを使用して、複数のテーブルを更新することもできます。product_priceテーブルに製品価格レコードがない場合は、製品テーブルのisdeleteフィールドを1に設定します。1006個の製品をproductテーブルに追加し、対応する情報をproduct_priceテーブルに追加しないでください。SQLステートメントは次のとおりです。

mysql> UPDATE product p LEFT JOIN product_price pp ON p.productid = pp.productid SET p.isdelete = 1 WHERE pp.productid IS NULL;
クエリOK、影響を受ける1行(0.04秒)
一致する行:1変更:1警告:0 

mysql> SELECT * FROM product; 
+ ---- + ----------- + ----------------------- +- ------ + ---------- + 
| id | productid | productname | price | isdelete | 
+ ---- + ----------- + --- -------------------- + ------- + ---------- + 
| 1 | 1001 | C言語ChineseNet Javaチュートリアル| 100 | 0 | 
| 2 | 1002 | C言語中国ネットワークMySQLチュートリアル| 110 | 0 | 
| 3 | 1003 | C言語中国ネットワークPythonチュートリアル| 120 | 0 | 
| 4 | 1004 | C言語中国ネットワークC言語チュートリアル| 150 | 0 | 
| 5 | 1005 | C言語の中国のWebサイトGoLangチュートリアル| 160 | 0 |
| 6 | 1006 | C言語中国語ネットスプリングチュートリアル| NULL | 1 |
+ ---- + ----------- + ----------------------- + ------- + ---------- + 
6行セット(0.00秒)

4.サブクエリ経由

サブクエリを使用して複数のテーブルを更新することもできます。SQLステートメントと実行プロセスは次のとおりです。

mysql> UPDATE product_price pp SET price =(SELECT price * 0.8 FROM product WHERE productid = pp.productid); 
クエリOK、影響を受ける5行(0.00秒)
一致する行:5変更:5警告:0 

mysql> SELECT * FROM product_price; 
+ ---- + ----------- + ------- + 
| id | productid | 価格| 
+ ---- + ----------- + ------- + 
| 1 | 1001 | 80 | 
| 2 | 1002 | 88 | 
| 3 | 1003 | 96 | 
| 4 | 1004 | 120 | 
| 5 | 1005 | 128 | 
+ ---- + ----------- + ------- + 
5行セット(0.00秒)

さらに、上記のいくつかの例は2つのテーブルに関連しており、1つのテーブルのレコードのみを更新します。MySQLは、2つのテーブルを同時に更新することもできます。次のステートメントは、両方のテーブルを同時に変更します。

UPDATE product p INNER JOIN product_price pp ON p.productid = pp.productid SET pp.price = p.price * 0.8、p.dateUpdate = CURDATE()

2つのテーブルは関連しており、product_priceテーブルのpriceフィールドとproductテーブルのdateUpdateが同時に更新されます。

2つのテーブルがあり、1つのテーブルが製品情報を格納するProductテーブルであり、製品価格列Priceが含まれているとします。もう1つのテーブルがProductPriceテーブルである場合、ProductPriceテーブルの価格フィールドPriceをの価格フィールドに更新する必要があります。価格表80%。
Mysqlには、これを行うためのいくつかの方法があります。1つは、table1 t1、table2 tsを更新することです...:

コードをコピーするコードは次のとおりです。


UPDATE product p、productPrice pp
SET pp.price = pp.price * 0.8
WHERE p.productId = pp.productId
AND p.dateCreated <'2004-01-01'


もう1つの方法は、内部結合を使用してから更新することです。

コードをコピーするコードは次のとおりです。


UPDATE product p
INNER JOIN productPrice pp
ON p.productId = pp.productId
SET pp.price = pp.price * 0.8
WHERE p.dateCreated <'2004-01-01'


さらに、左外部結合を使用して複数テーブルの更新を行うこともできます。たとえば、ProductPriceテーブルに製品価格レコードがない場合は、次のように、ProductテーブルのisDeletedフィールドを1に設定します。

コードをコピーするコードは次のとおりです。


UPDATE product p
LEFT JOIN productPrice pp
ON p.productId = pp.productId
SET p.deleted = 1
WHERE pp.productId IS null


さらに、上記のいくつかの例は2つのテーブルに関連していますが、1つのテーブルのレコードのみを更新します。実際、次のように2つのテーブルを同時に更新することができます。

コードをコピーするコードは次のとおりです。


UPDATE product p
INNER JOIN productPrice pp
ON p.productId = pp.productId
SET pp.price = pp.price * 0.8、
p.dateUpdate = CURDATE()
WHERE p.dateCreated <'2004-01-01'

2つのテーブルが関連付けられ、ProductPriceテーブルのpriceフィールドとProductテーブルフィールドのdateUpdateが更新されます。

具体的な例を見てみましょう。

注文の更新
        oo.userId = u.id 
set o.userName = u.name;で
    ユーザーu左結合

上記の例では、updateキーワードの後に​​マルチテーブル関連の結果セットが続きます。MySQLはマルチテーブル関連の結果セットを単一のテーブルとして直接扱い、この単一のテーブルに基づいて通常の更新操作を実行します。

SQL Serverとのわずかな違いは、SQL Serverのset句が更新される特定のテーブルに従い、MySQLのsetステートメントが更新される結果セットに従うことです(更新される特定のテーブルはsetステートメントで設定されます)。

 

おすすめ

転載: blog.csdn.net/weixin_42041819/article/details/112986031