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 update 多表更新_MySQL UPDATE多表关联更新相关推荐

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

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

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

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

  3. mysql 创建表字段长度范围_Mysql的建表规范与注意事项

    一. 表设计规范 库名.表名.字段名必须使用小写字母,"_"分割. 库名.表名.字段名必须不超过12个字符. 库名.表名.字段名见名知意,建议使用名词而不是动词. 建议使用Inno ...

  4. mysql 备份大表 存储过程_mysql批量备份表的存储过程写法

    1.在工作会遇到这种情况,mysql数据库,系统涉及到备份多表数据,为了方便,用存储过程来实现此功能,同时也复习一下存储过程的写法,同时记录下方便以后扩展修改 2.存储过程代码如下 -- 创建存储过程 ...

  5. mysql innodb表损坏_MySQL数据库INNODB表损坏修复处理过程分享

    ##状况描述 突然收到MySQL报警,从库的数据库挂了,一直在不停的重启,打开错误日志,发现有张表坏了.innodb表损坏不能通过repair table 等修复myisam的命令操作.现在记录下解决 ...

  6. mysql pdo 插入没效果_MySQL分库分表后用PHP如何来完美操作

    当单表达到几千万时,查询一次要很久,如果有联合查询,有可能会死在那 分库分表主要就是解决这个问题,减小数据库的负担,缩短查询时间分库 1)按功能分 用户类库.商品类库.订单类库.日志类.统计类库... ...

  7. MySQL数据库应用 多表查询_mysql数据库-多表查询

    今日任务 完成对MYSQL数据库的多表查询及建表的操作 教学目标 掌握MYSQL中多表的创建及多表的查询 掌握MYSQL中的表关系分析并能正确建表 昨天内容回顾: ​ 数据库的创建 : create ...

  8. mysql左连接去重查询_mysql之单表查询、多表查询

    mysql查询 单表查询 """ 增: insert [into] [数据库名.]表名[(字段1[,...,字段n])] values (数据1[,...,数据n])[, ...

  9. 使用mysql内连接查询年龄_Mysql的连表查询

    若一个查询同时涉及到两个以上的表,称为连表查询 准备表 create table department( id int auto_increment PRIMARY KEY, name varchar ...

最新文章

  1. CentOS安装EMACS文件夹树型图插件与颜色插件
  2. JMeter + influxdb + grafana框架安装
  3. PCB 内网实现《OCR文字识别》实现逻辑
  4. spring mvc 中文乱码 post与get的方法解决
  5. art-template入门(七)之压缩页面
  6. [one day one question] express 不缓存如何实现
  7. Python办公自动化|光速对比并提取两份Word/Excel中的不同元素
  8. Java并发编程之volatile变量
  9. 绝缘吹风机行业调研报告 - 市场现状分析与发展前景预测
  10. 通过CMD命令行获取文件夹下的所有文件名称(电脑小白专用)
  11. ubuntu14.04 配置C/C++开发IDE
  12. 使用JDK开发WebServrice案例
  13. nginx部署静态网站
  14. java中bool_java中boolean用法
  15. Python笔记1——Python概述
  16. 计算机主机有自带的声音吗,台式电脑主机前面的插孔没声音怎么回事?如何解决?...
  17. 借用计算机简谱,电脑编辑打印简谱之路怎么走——“电脑简谱助手”操作系列谈之二...
  18. matlab二值化处理、分形维数和结构占比计算
  19. 第九届蓝桥杯国赛 调手表
  20. OpenGL (太阳,地球,月亮 +太阳系八大行星)

热门文章

  1. 【Python】【小明爬楼梯】
  2. 百度amis技巧汇总页
  3. Vue.js 中created方法的作用【学习】
  4. CSS学习记录3.2/设置标签的背景颜色/控制背景图片的平铺方式/控制背景图片的位置/背景图片关联方式/背景图片和插入图片的区别/捕鱼达人背景练习/精灵图
  5. 【移动网络】Ch. 1 5G标准化与频谱
  6. cmd、命令大全、DOS命令、使用方法(超全),是我喜欢的文章
  7. Intel芯片组大全最新版
  8. 论文解读:《Linguistically Motivated Parallel Data Augmentation for Code-switch Language Model》
  9. C#计算工资(派生类)
  10. AHB和VPB的区别