MySQL 多表关联更新及删除

一、      多表关联更新

问题描述:现有tdb_goods表(含有具体信息)和tdb_goods_cates表(没有具体信息),需要查询tdb_goods表的所有记录,并且按"类别"分组,且将分组结果写入到tdb_goods_cates数据表。然后通过tdb_goods_cates数据表来更新tdb_goods

² 查询tdb_goods表的所有记录,并且按"类别"分组

  SELECT goods_cate FROM tdb_goods GROUP BYgoods_cate;

²  将分组结果写入到tdb_goods_cates数据表

  INSERT tdb_goods_cates (cate_name) SELECTgoods_cate FROM tdb_goods GROUP BY goods_cate;

²  通过tdb_goods_cates数据表来更新tdb_goods表

  UPDATE tdb_goods INNER JOIN tdb_goods_catesON goods_cate = cate_name

  SET goods_cate = cate_id ;

二、      多表关联删除

²  从MySQL数据表t1中把那些id值在数据表t2里有匹配的记录全删除掉

DELETE t1 FROM t1,t2 WHERE t1.id=t2.id 或DELETE FROM t1 USING t1,t2 WHERE t1.id=t2.id

²  从MySQL数据表t1里在数据表t2里没有匹配的记录查找出来并删除掉

DELETE t1 FROM t1 LEFT JOIN T2 ON t1.id=t2.idWHERE t2.id IS NULL 或

DELETE FROM t1,USING t1 LEFT JOIN T2 ONt1.id=t2.id WHERE t2.id IS NULL

²  从两个表中找出相同记录的数据并把两个表中的数据都删除掉

DELETE t1,t2 from t1 LEFT JOIN t2 ONt1.id=t2.id WHERE t1.id=25(注意此处的delete t1,t2 from 中的t1,t2不能是别名)

如:delete t1,t2 from table_name as t1left join table2_name as t2 on t1.id=t2.id where table_name.id=25 在数据里面执行是错误的(MySQL 版本不小于5.0在5.0中是可以的)

上述语句改写成

delete table_name,table2_name fromtable_name as t1 left join table2_name as t2 on t1.id=t2.id wheretable_name.id=25 在数据里面执行是错误的(MySQL 版本小于5.0在5.0中是可以的)

²  两张表关联删除:

DELETE a,b FROM table1 a INNER JOIN  table2 b ON a.id = b.aid WHERE a.id = '1'或DELETE a,b FROM table1a,table2 b WHERE a.id = b.aid AND a.id = '1'

 

²  三张表删除:

DELETE a,b,c FROM table1 a INNER JOIN  table2 b ON a.id = b.aid

INNER JOIN table3 c ON a.id = c.aid WHERE a.id = '1'

不过这样有一个问题,就是如果a表里数据,而b表或者c表里没数据,那么整个删除就失败,即删除0条数据

 

如果你的主表一定有数据,而关联的表有可能有数据也有可能没数据的话,我们可以通过左连接删除的方式,把两张表都删除。无论关联的表有没有数据,主表都可以删除成功

DELETE a ,b ,c FROM table1 a LEFT JOIN table2 b ONa.id = b.aid

LEFT JOIN table3 c ON a.id = c.aid WHERE a.id = 1

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多表关联删除是指在进行数据删除操作时,需要删除多个相关联的数据中的对应记录。要同时适配MySQL和PostgreSQL,在编写删除语句时,可以采用以下两种方式: 1. 使用子查询:在删除语句中使用子查询来获取需要删除的记录的关联数据中的主键,然后再执行删除操作。在MySQL中,可以使用IN子句进行多表删除,示例如下: ```sql DELETE FROM table1 WHERE column1 IN (SELECT column2 FROM table2 WHERE condition); ``` 在PostgreSQL中,可以使用EXISTS子查询进行多表删除,示例如下: ```sql DELETE FROM table1 WHERE EXISTS (SELECT 1 FROM table2 WHERE condition AND table2.column2 = table1.column1); ``` 2. 使用关联:在进行多表关联删除时,可以通过创建一个关联来存储需要删除的记录的主键,在删除操作完成后,再通过关联进行删除关联的数据中的记录。 ```sql CREATE TABLE delete_records ( id INT PRIMARY KEY ); -- 在删除操作前,将需要删除的记录的主键插入关联中 INSERT INTO delete_records (id) SELECT column2 FROM table2 WHERE condition; -- 删除操作完成后,根据关联的主键进行删除 DELETE FROM table1 WHERE column1 IN (SELECT id FROM delete_records); DELETE FROM table2 WHERE column2 IN (SELECT id FROM delete_records); -- 删除关联 DROP TABLE delete_records; ``` 通过以上两种方式,可以实现多表关联删除的适配MySQL和PostgreSQL的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值