MySQL同表更新问题:xID与ID值相等时更新行
解决方案:MySQL同表更新匹配xID与ID的行
咱们先捋清楚你的核心需求:当某行的xID值等于另一行的ID值时,用ID匹配行的Euro字段更新xID匹配行的Euro字段。你之前的更新语句没生效,问题出在关联条件写反了,咱们来一步步修正。
问题分析
你之前的语句用了kkk.ID = jjj.xID作为关联条件,但这和你的需求完全相反——你要找的是「需要被更新的行的xID等于源数据行的ID」,也就是kkk.xID = jjj.ID,这就是为什么语句执行后匹配不到任何行的原因。
正确的更新语句
下面是贴合你需求的修正版语句:
UPDATE `tbl_g` kkk JOIN `tbl_g` jjj ON kkk.xID = jjj.ID SET kkk.Euro = jjj.Euro WHERE kkk.xID IS NOT NULL; -- 过滤掉无xID的行,避免无效匹配
语句详解
- 我们通过自连接把表拆成两个逻辑别名:
kkk是需要被更新的「目标行」(比如你示例里xID=2025、ID=4441的行),jjj是提供数据的「源行」(比如你示例里ID=2025的行)。 JOIN条件kkk.xID = jjj.ID精准锁定了符合需求的行对:目标行的xID对应源行的ID。WHERE kkk.xID IS NOT NULL可以避免对没有xID值的行做无意义的匹配操作。
验证效果(用你的示例数据)
执行完更新语句后,再执行查询:
SELECT Euro, ALMACEN, Imagen, xID, ID FROM `tbl_g` WHERE xID IN (2025) OR ID IN (2025);
会得到预期的结果:
+--------+----------+--------+------+------+ | Euro | ALMACEN | Imagen | xID | ID | +--------+----------+--------+------+------+ | 7742,8 | ARGUALAS | NULL | NULL | 2025 | | 7742,8 | EMPALME | | 2025 | 4441 | +--------+----------+--------+------+------+
能看到ID=4441的行的Euro已经成功被更新为源行的7742,8了。
额外提示
如果要批量更新所有符合xID=ID规则的行(不止xID=2025的情况),直接去掉语句里的过滤限制即可,上面的写法本身就支持批量更新。
内容的提问来源于stack exchange,提问作者Antonio Mailtraq
相关产品推荐
相关产品推荐

