MySQL无法在FROM子句中指定要更新的目标表

时间:2014-11-20 08:44:26

标签: mysql subquery

我知道这里有相似的帖子,但我还没有找到适合自己的问题。

在MySQL表格中,我有从外部程序导入的文章。该程序将每篇文章作为父文章和变体发送两次,其中一些列包含其他数据。

我想规范化表格,将其他列数据写入父文章。

我的更新查询如下所示:

UPDATE  oxarticles
    SET     oxean = (SELECT oxean FROM oxarticles WHERE oxparentid = oxid),
            oxstock = (SELECT oxstock FROM oxarticles WHERE oxparentid = oxid),
            oxinsert = (SELECT oxinsert FROM oxarticles WHERE oxparentid = oxid)

而父母氧化物与儿童/变体的oxparentid柱结合。

不幸的是我收到错误:

Your can’t specify target table for update in FROM clause

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

你可以这样做:

UPDATE oxarticles a 
    LEFT JOIN oxarticles b ON a.oxid=b.oxparentid
SET a.oxean =b.oxean,
    a.oxstock  =b.oxstock ,
    a.oxinsert  =b.oxinsert 

答案 1 :(得分:0)

解决了它。这是我的解决方案。

UPDATE  oxarticles a
    SET     a.oxean = ( SELECT oxean FROM ( SELECT oxean, oxparentid, oxartnum FROM oxarticles) tmp WHERE tmp.oxparentid = a.oxid AND tmp.oxartnum LIKE '%GrLos%' LIMIT 0,1),
            a.oxstock = ( SELECT oxstock FROM ( SELECT oxstock, oxparentid, oxartnum FROM oxarticles) tmp WHERE tmp.oxparentid = a.oxid AND tmp.oxartnum LIKE '%GrLos%' LIMIT 0,1),
            a.oxinsert = ( SELECT oxinsert FROM ( SELECT oxinsert, oxparentid, oxartnum FROM oxarticles) tmp WHERE tmp.oxparentid = a.oxid AND tmp.oxartnum LIKE '%GrLos%' LIMIT 0,1),
            a.oxsubclass = ( SELECT oxsubclass FROM ( SELECT oxsubclass, oxparentid, oxartnum FROM oxarticles) tmp WHERE tmp.oxparentid = a.oxid AND tmp.oxartnum LIKE '%GrLos%' LIMIT 0,1),
            a.oxsort = ( SELECT oxsort FROM ( SELECT oxsort, oxparentid, oxartnum FROM oxarticles) tmp WHERE tmp.oxparentid = a.oxid AND tmp.oxartnum LIKE '%GrLos%' LIMIT 0,1),
            a.oxvarname = '',
            a.oxvarstock = 0,
            a.oxvarcount = 0,
            a.oxvarminprice = 0.00,
            a.oxvarmaxprice = 0.00

只是fyi:

 AND tmp.oxartnum LIKE '%GrLos%'

只识别表数据中的某种数据类型。在我的情况下,可能存在具有真实变体的文章。更新过程不得触及这些内容,因此我只选择“oxartnum”列中包含字符串“GrLos”的文章。

由于MySQL不支持同一个表中的udate操作,你必须强制MySQL创建一个临时表。这就是我们要对set操作中的子选择所做的事情:

SET a.oxean = ( SELECT oxean FROM ( SELECT oxean, oxparentid, oxartnum FROM oxarticles) tmp WHERE tmp.oxparentid = a.oxid AND tmp.oxartnum LIKE '%GrLos%' LIMIT 0,1)

如果文章中有多个variantes,我将subselect结果限制为1

limit 0,1

也许这可能在将来帮助其他人。