MySQL 可以基于多表查询更新数据。对于多表的 UPDATE 操作需要慎重,建议在更新前,先使用 SELECT 语句查询验证更新的数据与自己期望的是否一致。

下面我们建两张表,一张表为 product 表,用来存放产品信息,其中有产品价格字段 price;另外一张表是 product_price 表。现要将 product_price 表中的价格字段 price 更新为 product 表中价格字段 price 的 80%。

操作前先分别查看两张表的数据,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 rows in set (0.02 sec)

mysql> SELECT * FROM product_price;

+----+-----------+-------+

| id | productid | price |

+----+-----------+-------+

| 1 | 1001 | NULL |

| 2 | 1002 | NULL |

| 3 | 1003 | NULL |

| 4 | 1004 | NULL |

| 5 | 1005 | NULL |

+----+-----------+-------+

5 rows in set (0.01 sec)

下面是 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;

Query OK, 5 rows affected (0.02 sec)

Rows matched: 5 Changed: 5 Warnings: 0

mysql> SELECT * FROM product_price;

+----+-----------+-------+

| id | productid | price |

+----+-----------+-------+

| 1 | 1001 | 80 |

| 2 | 1002 | 88 |

| 3 | 1003 | 96 |

| 4 | 1004 | 120 |

| 5 | 1005 | 128 |

+----+-----------+-------+

5 rows in set (0.00 sec)

2. 通过INNER JOIN

另外一种方法是使用 INNER JOIN 来多表更新。SQL 语句如下:

mysql> UPDATE product p INNER JOIN product_price pp ON p.productid= pp.productid SET pp.price = p.price * 0.8;

Query OK, 5 rows affected (0.09 sec)

Rows matched: 5 Changed: 5 Warnings: 0

mysql> SELECT * FROM product_price;

+----+-----------+-------+

| id | productid | price |

+----+-----------+-------+

| 1 | 1001 | 80 |

| 2 | 1002 | 88 |

| 3 | 1003 | 96 |

| 4 | 1004 | 120 |

| 5 | 1005 | 128 |

+----+-----------+-------+

5 rows in set (0.00 sec)

3. 通过LEFT JOIN

也可以使用 LEFT JOIN 来做多表更新,如果 product_price 表中没有产品价格记录的话,将 product 表的 isdelete 字段设置为 1。在 product 表添加 1006 商品,且不在 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;

Query OK, 1 row affected (0.04 sec)

Rows matched: 1 Changed: 1 Warnings: 0

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 |

| 6 | 1006 | C语言中文网Spring教程 | NULL | 1 |

+----+-----------+-----------------------+-------+----------+

6 rows in set (0.00 sec)

4. 通过子查询

也可以通过子查询进行多表更新,SQL 语句和执行过程如下:

mysql> UPDATE product_price pp SET price=(SELECT price*0.8 FROM product WHERE productid = pp.productid);

Query OK, 5 rows affected (0.00 sec)

Rows matched: 5 Changed: 5 Warnings: 0

mysql> SELECT * FROM product_price;

+----+-----------+-------+

| id | productid | price |

+----+-----------+-------+

| 1 | 1001 | 80 |

| 2 | 1002 | 88 |

| 3 | 1003 | 96 |

| 4 | 1004 | 120 |

| 5 | 1005 | 128 |

+----+-----------+-------+

5 rows in set (0.00 sec)

另外,上面的几个例子都是在两张表之间做关联,只更新一张表中的记录。MySQL 也可以同时更新两张表,如下语句就同时修改了两个表。

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

两张表做关联,同时更新了 product_price 表的 price 字段和 product 表的 dateUpdate 两个字段。

日常开发中,一般都是用单表 UPDATE 语句,很少写多表关联的 UPDATE。

mysql 关联更新_MySQL UPDATE多表关联更新相关推荐

  1. mysql update 联合更新_Mysql update多表联合更新的方法小结

    下面我建两个表,并执行一系列sql语句,仔细观察sql执行后表中数据的变化,很容易就能理解多表联合更新的用法 student表 class表 1. 执行 UPDATE student s , clas ...

  2. mysql update 多表更新_MySQL UPDATE多表关联更新

    MySQL 可以基于多表查询更新数据.对于多表的 UPDATE 操作需要慎重,建议在更新前,先使用 SELECT 语句查询验证更新的数据与自己期望的是否一致. 下面我们建两张表,一张表为 produc ...

  3. mysql中3张表如何关联查询_mysql三张表关联查询

    三张表,需要得到的数据是标红色部分的.sql如下: select a.uid,a.uname,a.upsw,a.urealname,a.utel,a.uremark, b.rid,b.rname,b. ...

  4. MySQL查询结果复制到新表(更新、插入)

    MySQL查询结果复制到新表(更新.插入): MySQL中可以将查询结果复制到另外的一张表中,复制的话通常有两种情况,一种是更新已有的数据,另一种是插入一条新记录.下面通过例子来说明.首先构建两个测试 ...

  5. 【转】MySQL中select * for update锁表的问题

    MySQL中select * for update锁表的问题 由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例 ...

  6. MySQL UPDATE多表关联更新

    MySQL 可以基于多表查询更新数据.对于多表的 UPDATE 操作需要慎重,建议在更新前,先使用 SELECT 语句查询验证更新的数据与自己期望的是否一致. 下面我们建两张表,一张表为 produc ...

  7. 22、UPDATE多表关联更新

    MySQL 可以基于多表查询更新数据.对于多表的 UPDATE 操作需要慎重,建议在更新前,先使用 SELECT 语句查询验证更新的数据与自己期望的是否一致. 下面我们建两张表,一张表为 produc ...

  8. mysql join 去重_MySQL Update inner join数据库去重,以及根据一张表的值更新另一张表...

    1 问题来源 这几天在项目中遇到一个问题:由于前期设计不合理,导致后期用户录入数据时,基础数据表中有重复多余数据.如下: 出现两个 2G网络测试手机 这样类似的基础数据,直接后果就是用户在使用这个基础 ...

  9. Oracle update 多表关联更新

    需求 有一个部门的表(dept), 部门编号(deptno) 部门员工数(emps) 部门员工的总工资(income) 还有一个员工表(emp) 员工编号(empid) 所属部门(deptno) 工资 ...

最新文章

  1. 《中国人工智能学会通讯》——1.42 理解情感
  2. 让语音助手听懂方言,这个数据集能搞定
  3. 浅析人类最贵、最大的机器学习模型GPT-3及背后隐含的商业逻辑
  4. 简单几步制作软raid
  5. mysql -存储过程的学习
  6. java 数组a赋值给数组b_java编程将a,b数组中不同的数字保存到一个新的数组中
  7. 如何将实时计算 Flink 与自身环境打通?
  8. 微信团队分享:微信移动端的全文检索多音字问题解决方案
  9. fir滤波器matlab实现_关于FIRamp;IIR系统的算法说明以及结果验证(1)
  10. Flowable快速工作流脚手架_Jsite角色授权不显示
  11. java子类访问父类私有成员_Java中子类可以继承父类的私有成员,但是不能(直接)访问!!!...
  12. 你不能忽视的HTML语言
  13. 图像质量评估算法SSIM(结构相似性)
  14. python24点4张扑克_Python实现扑克24点 ,从此我就没输过。
  15. 分享:大讲台在线学习平台怎么样,靠谱吗?
  16. C#实践——计算GPA
  17. 此计算机上无法找到autocad2017,主编操作win7系统安装autocad2017提示“无法定位inf文件ACAD.inf”的具体步骤...
  18. 中央财经大学博士后于鲁平:不同于技术和应用,监管永远只能前进一小步!
  19. Showing All Errors Only Command PhaseScriptExecution failed with a nonzero exit code
  20. Eclipse优化,关闭不必要的验证,简单粗暴!

热门文章

  1. 51信用卡 Android 架构演进实践
  2. 颜色的前世今生20·三原色到底该用哪一个?!
  3. cad的dwg如何转换成pdf?
  4. 如何把一个文件压缩成几个固定大小的文件及解压缩
  5. 深度学习框架tensorflow学习与应用6(防止过拟合dropout,keep_prob =tf.placeholder(tf.float32))
  6. 上海居住证积分办理攻略,太容易了,快来收藏!!!
  7. 五、T100采购应付之应付账款核销管理篇
  8. Workspaces can only be enabled in private projects.
  9. 原来做炫酷图表这么容易
  10. 计算机网申兴趣爱好怎么写,网申个人爱好如何填写?