sql 批量根据主键删除数据
时间: 2023-09-13 16:03:26 浏览: 157
可以使用 SQL 的 `IN` 关键字或者 `JOIN` 关键字来批量删除数据。
使用 `IN` 关键字:
```sql
DELETE FROM 表名 WHERE 主键列名 IN (值1, 值2, 值3, ...);
```
例如,删除主键为 1、2、3 的数据:
```sql
DELETE FROM my_table WHERE id IN (1, 2, 3);
```
使用 `JOIN` 关键字:
```sql
DELETE t1 FROM 表1 t1 JOIN 表2 t2 ON t1.主键列名 = t2.主键列名 WHERE 条件;
```
例如,删除主键为 1、2、3,且满足某个条件的数据:
```sql
DELETE t1 FROM my_table t1 JOIN my_table2 t2 ON t1.id = t2.id WHERE t1.id IN (1, 2, 3) AND t2.some_column = 'some_value';
```
注意:在使用 `IN` 关键字时,要确保输入的主键值唯一且不为空,否则可能会删除不该删除的数据。在使用 `JOIN` 关键字时,要确保连接条件正确,否则可能会删除不该删除的数据。建议在执行删除操作前先备份数据。
相关问题
根据主键批量删除sql
在SQL中,根据主键批量删除数据通常涉及两个步骤:
### 第一步:查询需要删除的数据
首先,你需要创建一个查询来获取所有满足条件(这里通常是某个特定条件与你要删除的主键相匹配)的行。这可以使用 `SELECT` 语句结合 `WHERE` 子句来完成。
例如,假设我们有一个名为 `employees` 的表,其中包含员工信息,并通过 `employee_id` 列作为主键。如果你想删除所有雇佣日期超过某一天的所有员工记录,则可以编写如下的 SQL 查询:
```sql
SELECT * FROM employees WHERE hire_date < '2020-01-01';
```
这条查询返回的是那些雇佣日期早于2020年1月1日的所有员工记录。
### 第二步:执行删除操作
接下来,使用 `DELETE` 语句从表中移除这些记录。同样地,这个操作也需要通过 `WHERE` 子句来指定删除哪些记录。
对于上述例子,相应的删除语句将看起来像这样:
```sql
DELETE FROM employees WHERE employee_id IN (SELECT employee_id FROM employees WHERE hire_date < '2020-01-01');
```
这条命令会从 `employees` 表中删除所有雇佣日期早于2020年1月1日的员工记录。这里的关键在于使用了 `IN` 运算符结合子查询,这样可以一次性处理多个匹配项而不是逐条执行删除操作。
### 安全提示
执行这样的操作之前,建议做好数据库备份,并对权限进行适当控制以避免误删重要数据。同时,在实际应用中,最好有适当的错误处理机制来应对可能出现的异常情况。
---
mybatis从前端传来数据联合主键批量删除
可以通过在Mapper接口中定义一个方法,使用@DeleteProvider注解,实现使用Mybatis动态SQL语句进行批量删除。
具体实现方法如下:
1.在Mapper接口中定义一个方法,使用@DeleteProvider注解,指定动态SQL生成器类。
@Mapper
public interface YourMapper {
@DeleteProvider(type = YourDynamicSqlBuilder.class, method = "batchDelete")
int batchDelete(List<Map<String, Object>> dataList);
}
2.实现动态SQL生成器类YourDynamicSqlBuilder,实现batchDelete方法,生成动态SQL语句。
public class YourDynamicSqlBuilder {
/**
* 批量删除
*
* @param map 参数
* @return sql
*/
public String batchDelete(Map<String, Object> map) {
List<Map<String, Object>> dataList = (List<Map<String, Object>>) map.get("list");
StringBuilder sql = new StringBuilder();
sql.append("DELETE FROM your_table_name WHERE ");
for (Map<String, Object> data : dataList) {
sql.append("(");
boolean flag = false;
for (String key : data.keySet()) {
if (flag) {
sql.append(" AND ");
} else {
flag = true;
}
sql.append(key).append("=").append("#{list.").append(key).append("}");
}
sql.append(")");
sql.append(" OR ");
}
sql.delete(sql.length() - 4, sql.length());
return sql.toString();
}
}
3.在controller层中调用批量删除方法。
@Autowired
private YourMapper yourMapper;
...
@RequestMapping(value = "/batchDelete", method = RequestMethod.POST)
@ResponseBody
public String batchDelete(@RequestBody List<Map<String, Object>> dataList) {
int result = yourMapper.batchDelete(dataList);
return result > 0 ? "success" : "fail";
}
注意,此处的dataList为前端传来的参数,其中包含需要删除的数据的联合主键。具体实现根据自己的业务需求进行调整。
阅读全文