MySQL 无法在 FROM 多个表连接中指定要更新的目标表
Posted
技术标签:
【中文标题】MySQL 无法在 FROM 多个表连接中指定要更新的目标表【英文标题】:MySQL can’t specify target table for update in FROM multiple table joins 【发布时间】:2016-07-03 06:01:31 【问题描述】:我已经搜索了好几天,以了解如何在尝试更新多连接表中的字段时解决此错误,并使用同一多连接表集中的最短日期。
这是我的更新声明:
update vtiger_projectmilestone
Inner Join vtiger_projectmilestonecf ON vtiger_projectmilestone.projectmilestoneid = vtiger_projectmilestonecf.projectmilestoneid
Inner Join vtiger_crmentity ON vtiger_projectmilestone.projectmilestoneid = vtcrmm.crmid
inner join vtiger_project on vtiger_project.projectid = vtiger_projectmilestone.projectid
Inner Join vtiger_crmentity vtcrmp ON vtcrmp.crmid = vtiger_project.projectid
set vtiger_projectmilestone.projectmilestonedate =
(select min(vtiger_projecttaskcf.cf_779)
FROM vtiger_projecttask tvpt
Inner Join vtiger_projecttaskcf tvptcf ON tvpt.projecttaskid = tvptcf.projecttaskid
Inner Join vtiger_projectmilestone tvpm ON tvpm.projectmilestoneid = tvpt.projecttasknumber
Inner Join vtiger_projectmilestonecf vtpmcf ON tvpm.projectmilestoneid = tvpmcf.projectmilestoneid
Inner Join vtiger_crmentity AS vtcrmm ON tvpm.projectmilestoneid = vtcrmm.crmid
Inner Join vtiger_crmentity AS vtcrmt ON tvpt.projecttaskid = vtcrmt.crmid
where tvpm.projectmilestone_no = vtiger_projectmilestone.projectmilestone_no
)
where vtiger_projectmilestone.projectid =
(select vtiger_project.projectid from vtiger_project
INNER JOIN vtiger_crmentity vtcrmp ON vtiger_project.projectid = vtcrmp.crmid
where vtcrmp.deleted = 0 order by vtiger_project.projectid desc limit 1)
and vtcrmp.deleted = 0
and vtcrmm.deleted = 0
and (vtiger_projectmilestone.projectmilestonedate is null or vtiger_projectmilestonecf.cf_763 is null) ;
这是一个真实的更新查询,而不仅仅是一个简单的表关系。
我通过创建一个临时表、插入值、更新目标表和删除临时表来解决这个问题。
我真的很想解决这个问题,因为它会更频繁地出现。
感谢所有帮助。
干杯 伯纳德·贝利
【问题讨论】:
【参考方案1】:正如this answer 中所述,您不能在子查询中使用目标更新表,正如您在查询中看到的那样
SELECT min(vtiger_projecttaskcf.cf_779)
FROM vtiger_projecttask tvpt
Inner Join vtiger_projecttaskcf tvptcf ON tvpt.projecttaskid = tvptcf.projecttaskid
Inner Join
--using target update table in query
vtiger_projectmilestone tvpm ON tvpm.projectmilestoneid = tvpt.projecttasknumber
Inner Join vtiger_projectmilestonecf vtpmcf ON tvpm.projectmilestoneid = tvpmcf.projectmilestoneid
Inner Join vtiger_crmentity AS vtcrmm ON tvpm.projectmilestoneid = vtcrmm.crmid
Inner Join vtiger_crmentity AS vtcrmt ON tvpt.projecttaskid = vtcrmt.crmid
where tvpm.projectmilestone_no = vtiger_projectmilestone.projectmilestone_no
但是我认为解决方法是使用您正在更新的表中的数据,因此您可以编写一些 where 条件,而不是使用连接,例如:
SELECT min(vtiger_projecttaskcf.cf_779)
FROM vtiger_projecttask tvpt
Inner Join vtiger_projecttaskcf tvptcf ON tvpt.projecttaskid = tvptcf.projecttaskid
Inner Join vtiger_projectmilestonecf vtpmcf ON tvpm.projectmilestoneid = tvpt.projecttasknumber
Inner Join vtiger_crmentity AS vtcrmm ON tvpt.projecttasknumber = vtcrmm.crmid
Inner Join vtiger_crmentity AS vtcrmt ON tvpt.projecttaskid = vtcrmt.crmid
where tvpm.projectmilestone_no = vtiger_projectmilestone.projectmilestone_no
--using the projectmilestoneid in a where clause
AND tvpt.projecttasknumber=vtiger_projectmilestone.projectmilestoneid
需要注意的是,您可能会遇到一些性能问题,此外,由于我不知道完整的架构,我无法判断在子查询中使用其他表而不是 vtiger_projectmilestone 是否会给您正确的结果
【讨论】:
以上是关于MySQL 无法在 FROM 多个表连接中指定要更新的目标表的主要内容,如果未能解决你的问题,请参考以下文章
Mysql 错误:1093 - 无法在 FROM 子句中指定要更新的目标表
sql mysql错误您无法在FROM子句中指定要更新的目标表
MySQL #1093 - 您不能在 FROM 子句中指定目标表“赠品”进行更新
MySQL 错误您不能在 FROM 子句中指定要更新的目标表