mysql批量删除,已经获得id,条件是另一个表,不存在的就删除,请问sql语句怎么写?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql批量删除,已经获得id,条件是另一个表,不存在的就删除,请问sql语句怎么写?相关的知识,希望对你有一定的参考价值。

两个表有相同的ID关联字段,A表是供应商,B表示订单表,如果删除A表5条记录,ID分别为1,2,3,4,5,当B表里面有条记录,ID为1,此时值删除A表里面ID 为2,3,4,5

参考技术A delete from A
where id not in (select id from B);
希望可以帮到你,不过我感觉这条语句效率不会太高。本回答被提问者和网友采纳
参考技术B delete from t_spcst where
SpCstID not in (select SpCstID from T_Order) and
SpCstID between '1208' and '1192'追问

不行

追答

delete from t_spcst where
SpCstID not in (select SpCstID from T_Order) and
SpCstID-0 between '1208' and '1192' 试试这个

追问

不行

追答

delete t_spcst where
SpCstID not in (select SpCstID from T_Order) and
SpCstID-0 between '1208' and '1192'

追问

between 这个关键字,不能用在这,不合适,,我是选着性的删除,,有可能全部100条记录,,

追答

delete from t_spcst a where a.SpCstID not in (select SpCstID from T_Order b) and a.SpCstID in (1208,1192)
试试吧

参考技术C 楼上正解追问

我是选着行的删除,而不是把所有A表里面没有B表的ID删除,我选着哪一个,就删除哪一个,如果有就不删除,没有就删除

追答

delete from A
where id not in (select id from B) and id =选中行的ID

追问

我是用的mysql数据库,执行就报错,而在SQl Server里面就可以用,不知道为什么?

追答

delete from A
where not exists (select id from B where id=A.id) and id =选中行的ID
试试这样行不行

追问

delete from t_spcst where SpCstID not in (select SpCstID from T_Order) and SpCstID in ('1208','1192')
这是打印的SQl,并没有报错,但就是没有删除数据
这个 not exists 关键字我用过了,也不行

追答

你确定有 t_spcst 表有记录而T_Order表没有关联的记录吗,SpCstID是什么类型?

追问

A表的主键bigint,确定,我都是SQl语句查出来t_spcst 表有的,而T_Order表没有的操作,我觉得与Mysql数据库有关系,奇怪sql Server 里面可以执行,为什么Mysql 里面不能执行呢?

追答

bigint类型就不能这么写SpCstID in ('1208','1192') ,不能带引号!

delete from t_spcst where SpCstID not in (select SpCstID from T_Order) and SpCstID in (1208,1192)

追问

还是不行

 

追答

第一条语句执行返回消息是什么

追问

 

追答

delete from t_spcst
where not SpCstID in (select SpCstID from T_Order) and SpCstID in (1208,1192)

追问

执行报错呢?

 

追答

把not 放前面:
delete from t_spcst
where (not SpCstID in (select SpCstID from T_Order)) and (SpCstID in (1208,1192))

再不行的话,可能是你Mysql版本太低,知道里有很多说低版本不支持delete条件用子查询的

mysql批量删除数据方法及注意事项

一、批量删除数据有三种常见的方法

1、drop table

当不需要该表时,可以使用该方法。

2、truncate table

删除所有数据,同时保留表,速度很快。
可以理解为,drop table然后再create table。

3、delete from table

可以删除所有数据,也能保留表,但性能较差。
也可以带where条件删除部分数据,灵活性强。

二、truncate和delete的相同之处:

truncate和delete都能够删除所有数据,且保留表

三、truncate和delete的差异,

1、truncate是DDL语句,它不存在所谓的“事务回滚”;
delete是DML语句,它执行完是可以rollback的。

2、truncate table返回值是0;
delete from table返回值是被删除的行数。

3、InnoDB支持一个表一个文件时:
truncate会一次性把表干掉,且不会激活触发器,速度非常快;
delete from table则会一行一行删除,会激活触发器,速度比较慢。
delete数据,是要记录日志的,truncate表不需要记录日志。

4、当表中有列被其它表作为外键(foreign key)时:
truncate会是失败; delete则会成功。

5、当表中有自增列是:
truncate会使得自增列计数复原;
delete所有数据后,自增列计数并不会复原,而是保持原来的顺序自增。

以上是关于mysql批量删除,已经获得id,条件是另一个表,不存在的就删除,请问sql语句怎么写?的主要内容,如果未能解决你的问题,请参考以下文章

sql命令删除id用SQL语句批量删除指定ID

mysql 数据库表批量更新,需要set的数据是另一个表中的字段

mysql 数据库表批量更新,需要set的数据是另一个表中的字段

mysql 如何更新某一条数据内容

如何在同一个表上组合两个查询以在 MySQL 中获得单个结果集

mysql批量删除指定前缀或后缀表