Mysql通过ID从另一个表中删除一个表

Posted

技术标签:

【中文标题】Mysql通过ID从另一个表中删除一个表【英文标题】:Mysql delete in one table by id's from another table 【发布时间】:2013-02-19 17:30:08 【问题描述】:

我有两张桌子:

A
id | name

B
id | name

在 B 表上,我创建查询以选择所有数据,其中 id 位于(...某些值),但是我如何在一个查询中选择此 B - id 并从 A 中删除,其中 A.id = B.id ?

我是 sql 新手....找不到如何在一个查询中组合所有内容...

*i 必须在某些类似查询中从 b 中选择,例如我的 b 查询:select * from B where somefieldinteger in (1,4,9,21,25) 并且 b.id 必须与 a* 进行比较

更新 这个抛出错误

delete `LINK_LA_TYP` FROM `LINK_LA_TYP` JOIN `LINK_ART` ON `LINK_LA_TYP`.LAT_LA_ID=`LINK_ART`.LA_ID JOIN `ARTICLES` ON `LINK_ART`.LA_ART_ID=`ARTICLES`.ART_ID WHERE (`ARTICLES`.ART_SUP_ID in (10008,10439,11005,10097,10669,11100,80,10912,10683,10675,10194,11196,1166,10730,10248,10870,11200,11059,247,10121,10911,489,10724,496,10093,10205,1318,10953,11199,11047,128,114,194,10865,11058,10345,1286,10667,10064,11077,10622,11205,10917,10344,495,10709,10954,10744,304,10957,10447,10764,10129,10862,10918,10731,11115,10095,10859,10580,1345,10177,10323,144,11182,10132,256,10941,58,10006,10017,10780,10765,10665,11110,10714,10224,750,10267,10179,10725,10774,11063,10868,10103,10676,10057,10649,255,10322,11022,309,10754,11121,10801,10018,11004,10245,146,11056,381,10781,10699,11120,11126,830,10240,11162,10436,10584,10342,10861,11190,10721,11171,10564,10545,94,10087,73,10755,10869,10547,10706,10346,444,426,10059,153,122,10674,64,113,11101,10231,10337,806,11117,10385,251,11188,491,11192,100,10792,10069,10864,11099,10246,10178,10758,10568,10230,10124,10384,10782,10726,384,10670,305,10763,10768,10585,10394,10552,498,10677,1348,168,10814,10582,10382,11093,11173,10381,427,441)) limit 50

【问题讨论】:

【参考方案1】:

像这样使用deletejoin

mysql> create table a (id int);
mysql> insert into a values (1), (2), (3), (4);
mysql> create table b (id int);
mysql> insert into b values (2), (3);
mysql> delete a from a join b on a.id=b.id where b.id > 2;
mysql> select * from a;
+------+
| id   |
+------+
|    1 |
|    2 |
|    4 |
+------+

这可以扩展到任意数量的表,例如:

DELETE a 
FROM a 
JOIN b ON a.idA=b.idA 
JOIN c ON b.idB=c.idB;

这将从a 删除所有从b 的记录引用的记录,而这些记录又从c 引用。您也可以像这样添加 WHERE 子句:

DELETE a 
FROM a 
JOIN b ON a.idA=b.idA 
JOIN c ON b.idB=c.idB
WHERE a.status='done' AND
      b.status='open' AND
      c.status='open';

如果要限制要删除的行数,请执行以下操作:

DELETE a 
FROM a 
JOIN b ON a.idA=b.idA 
JOIN c ON b.idB=c.idB
LIMIT 500000;

如果要删除前 500000 行,则需要细化哪些行在前,因此需要在行之间建立一些排序。换句话说,您需要按某些标准对行进行排序,然后像这样限制:

DELETE a 
FROM a 
JOIN b ON a.idA=b.idA 
JOIN c ON b.idB=c.idB
ORDER BY a.something
LIMIT 500000;

【讨论】:

这个表没有关系 @ValdisAzamaris 你说的关系是什么意思?在我的示例中,ab 之间没有明确的关系。 注意! a.id = b.id 很好,但首先我必须在一些类似的查询中从 b 中选择,例如我的 b 查询:select * from B where somefieldinteger in (1,4,9,21,25) 和那个 b。 id 必须与 a 进行比较 @ValdisAzamaris 添加了如何做到这一点的部分 为什么是 b.id > 2 ?也许聊天... .russian ?【参考方案2】:
delete from A where exists (select 1 from B where A.id=B.id and B.criteria=true)

如果您省略 ... 并且 B.criteria=true 它将删除 A 中出现在 B 中的所有行;否则你删除任何符合你的条件。

【讨论】:

以上是关于Mysql通过ID从另一个表中删除一个表的主要内容,如果未能解决你的问题,请参考以下文章

触发器从另一个表中删除行

基于从另一个表中选择的值进行限制

将 hive 外部表更改为同一数据库中的内部表也会从另一个表中删除数据

使用 MySQL LEFT JOIN 删除行

删除触发器并从另一个表中获取字段

自动从 Mysql 表中删除的记录