mysql 的多表关联删除

在项目中经常会碰到多层表结构的设计,当碰到删除的时候如果单个表逐一删除,不仅牺牲效率还容易出错。

所以在mysql 4.0 推出了 跨表 delete 功能,简单的说就是 可以在一个SQL里面对多张表的指定一条数据或多条数据进行删除。

现有 table1 和 table2 两张表,他们的外键是ID, 不说了直接上SQL。

delete 
  table1.*,
  table2.* 
from
  table1,
  table2 
where table1.id = table2.id 
  and table1.id = 1 

也可以用 inner join 来连接

delete 
  table1.*,
  table2.* 
from
  table1 
  inner join table2 
    on table1.id = table2.id 
    and table1.id = 1 

既然可以使用 inner join ,那么使用 left join 和 right join 当然也是没问题的。

注意:在内连接时要使用别名,并且 sql 中不能使用 order  by 和 limit 函数



### MySQL关联删除语句的写法与解决方案 在MySQL中,`DELETE`语句可以用于从一个或删除记录。当需要基于之间的关联条件删除数据时,可以使用`DELETE JOIN`语句结合`INNER JOIN`或`LEFT JOIN`来实现[^2]。以下是对关联删除语句的具体说明及示例。 #### 1. 单删除删除操作可以通过`DELETE FROM table_name WHERE condition`完成。如果需要删除所有记录,可以省略`WHERE`子句,但不推荐直接删除所有数据,除非明确需求[^3]。 #### 2. 关联删除 关联删除允许从一个或删除数据,具体语法如下: ```sql DELETE table1, table2 FROM table1 INNER JOIN table2 ON table1.column = table2.column WHERE condition; ``` - **`table1, table2`**:指定要删除数据的。 - **`INNER JOIN`**:用于指定两个之间的关联条件。 - **`condition`**:可选,用于进一步限制删除的记录范围。 #### 示例:基于两关联删除数据 假设存在两个`student`和`score_graph`,它们通过`id`字段关联。现在需要删除`student`中`teacher_id=1`的所有记录,同时删除`score_graph`中对应的记录。 ```sql DELETE student, score_graph FROM student INNER JOIN score_graph ON student.id = score_graph.student_id WHERE student.teacher_id = 1; ``` 上述语句会同时删除`student`和`score_graph`中满足条件的记录[^2]。 #### 3. 注意事项 - **外键约束**:如果之间存在外键约束,可能需要先禁用外键检查或调整删除顺序[^1]。 - **不可回滚**:`TRUNCATE`操作是DDL语句,会隐式提交且无法回滚,因此不适合用于关联删除场景。 - **性能优化**:对于大规模数据删除,建议分批次执行以减少锁时间[^3]。 #### 4. 示例代码块 以下是完整的删除示例代码: ```sql -- 示例数据准备 CREATE TABLE student ( id INT PRIMARY KEY, name VARCHAR(50), teacher_id INT ); CREATE TABLE score_graph ( student_id INT, score INT, FOREIGN KEY (student_id) REFERENCES student(id) ); INSERT INTO student (id, name, teacher_id) VALUES (1, '尹正杰', 1), (2, '张三', 2); INSERT INTO score_graph (student_id, score) VALUES (1, 90), (2, 80); -- 删除student中teacher_id=1的记录,同时删除score_graph中的关联记录 DELETE student, score_graph FROM student INNER JOIN score_graph ON student.id = score_graph.student_id WHERE student.teacher_id = 1; -- 验证结果 SELECT * FROM student; SELECT * FROM score_graph; ``` #### 5. 总结 关联删除是一种高效的数据清理方式,适用于需要基于关联条件同步删除中数据的场景。通过合理使用`DELETE JOIN`语句,可以避免手动分步操作带来的复杂性和潜在错误。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值