【问题标题】:MySQL - UPDATE with INNER SELECTMySQL - 使用 INNER SELECT 进行更新
【发布时间】:2026-02-02 12:45:01
【问题描述】:

我想做这样的事情,但似乎我做不到:

UPDATE products p2
SET
manufacturer = 
(
SELECT manufacturer
FROM products p, manufacturers m, etc.
WHERE
...other stuff...
p.name LIKE CONCAT('%',m.name,'%')    
AND p.id = p2.id
)
WHERE manufacturer = 0

错误是: #1093 - 您不能在 FROM 子句中指定目标表 'p2' 进行更新

问题是我在表中有一个制造商字段,但一些制造商名称在 product_name-string 而不是制造商字段中,所以我必须通过 product_name 获取制造商 ID 并更新产品-表其制造商 ID。

我可以分两步完成,但我喜欢一步完成。

【问题讨论】:

  • AND p.id = p2.id 这里的 p2 是什么??

标签: mysql select sql-like


【解决方案1】:

http://dev.mysql.com/doc/refman/5.0/en/subquery-errors.html 上关于同一错误的评论说,“如果您同时使用子查询读取相同的数据,MySQL 不允许更新或删除表的数据。” p>

【讨论】:

  • 我相信你必须用这些序列重写你的单个语句,也许使用Cursors
【解决方案2】:

试试这个查询 -

UPDATE products p
  JOIN manufacturers m
    ON LOCATE(p.name, m.name) > 0
SET p.manufacturer = m.id;

...但首先检查记录是否正确连接 -

SELECT * FROM products p
  JOIN manufacturers m
    ON LOCATE(p.name, m.name) > 0 -- bind records in two tables

【讨论】:

    【解决方案3】:

    一个工作表上的示例:

    此语句将所有 AKTIV 记录移动到 DEAKTIV 其中已经存在匹配的 DRAFT 记录:

    update table1 fa inner join table1 fe on (fa.datum = fe.datum and fa.firmenid = fe. firmenid and  fe.status = 'DRAFT')
    set fa.status = 'DEACTIV'
    where fa.firmenid = '+49151506292' and fa.status = 'ACTIV';
    

    执行上述语句后,我只需将 DRAFT 记录更新为 ACTIV 并提交

    【讨论】:

      【解决方案4】:

      看看这种查询是否适合你

      UPDATE products p2 INNER JOIN manufacturers m ON m.product_id = p2.id AND p2.name LIKE CONCAT('%',m.name,'%') SET manufacturer = YOURVALUE
      

      您可能必须根据我的假设修改上述查询

      【讨论】: