mysql - 使用连接删除多个表而不是删除所有表
问题描述
我正在使用连接从多个表中删除,但此查询的问题是,如果一个表不包含匹配值/为空,则不会对具有匹配值和数据的表执行删除。我该如何解决这个问题?
CREATE DEFINER=`root`@`localhost` PROCEDURE `gdpr_delete`(_email_ varchar(128))
BEGIN
DELETE AppCoverLetter, AppError, AppFormData, AppJobData, AppTrackingData, FlowLog, App,AppResume
FROM AppCoverLetter t1
INNER JOIN (
SELECT AppId
FROM ApplyData.AppFormData
where lower(Email) = lower(_email_)
) t3 ON t1.AppID = t3.AppId
INNER JOIN AppError ON AppError.AppID = t3.AppId
INNER JOIN AppCoverLetter ON AppCoverLetter.AppID = t3.AppId
INNER JOIN AppFormData ON AppFormData.AppID = t3.AppId
INNER JOIN AppJobData ON AppJobData.AppID = t3.AppId
INNER JOIN AppTrackingData ON AppTrackingData.AppID = t3.AppId
INNER JOIN FlowLog ON FlowLog.AppID = t3.AppId
INNER JOIN App ON App.AppID = t3.AppId
INNER JOIN AppResume ON AppResume.AppID = t3.AppId;
END
解决方案
如果您并不总是匹配行,您可以使用单独的删除和单连接来避免循环
DELETE tx
FROM table3 tx
INNER JOIN (
SELECT AppId
FROM ApplyData.AppFormData
where lower(Email) = lower(_email_)
) t3 ON tx.AppID = t3.AppId
但是您可能有一些具有可靠持久关系的表,然后对于这些表,您可以使用单个查询进行多次删除,并将单个连接删除仅保留给可选关系
推荐阅读
- java - tomcat 启动但它没有监听任何端口
- angular - angular 7 应用程序的 url 中重复的 base href
- javascript - 如何使用 Node.js 运行功能服务器端而不是使用 Javascript 的浏览器端?
- java - mediaplayer 不播放广播电台流
- spring - 无法加载 JDBC 驱动程序类 'com.mysql.jdbc.Driver' maven 依赖项
- android - WorkManager setRequiresDeviceIdle 令人困惑
- sublimetext3 - Sublime Text 3 SFTP 无法使用密钥文件“~/.ssh/id_rsa”(无法打开文件)
- php - PHP将数组格式(如first_name)更改为名字
- reactjs - 为单个组件实现 redux 好吗?
- javascript - 从类方法调用发射时的不同行为