MYSQL:我想用另一个表中的值更新表中的所有行,其中第一个表中的值等于第二个表
Posted
技术标签:
【中文标题】MYSQL:我想用另一个表中的值更新表中的所有行,其中第一个表中的值等于第二个表【英文标题】:MYSQL: I want to update all rows in a table with values from another table where values from the first table are equal to the second 【发布时间】:2021-05-03 19:03:05 【问题描述】:我正在尝试更新损坏的 WordPress 术语关系(在表 wp_terms 和 wp_term_relationships 中)。
在 Wordpress 中输入了一些标签,使用它们的“term_id”编号而不是它们的“名称”,因此不是创建与原始正确标签的关系,而是创建一个以此编号作为名称的新标签。
(例如,如果标签“toy”的 term_id -> 2010,则新标签被命名为“2010”,并带有一个新的随机 term_id,比如 30453)。
在上表中,两个对象(3456 和 4362)的正确关系是与“toy”(term_id 为 2010),但错误创建了一个新术语(“2010”)和另一个 term_id(30453)。 我们希望两个 object_id 都与 2010 相关,如下所示:
尝试修复关系并将 object_id 与正确的 term_id 相关联,我尝试了以下 SQL 查询:
UPDATE wp_term_relationships JOIN wp_terms SET wp_term_relationships.term_taxonomy_id = wp_terms.name WHERE wp_terms.name REGEXP '^[0-9]*$' AND wp_term_relationships.term_taxonomy_id = CAST(wp_terms.name as INTEGER);
(我将 wp_terms.name 转换为 INTEGER 以避免类型不匹配,但我不知道是否有必要。)
此查询运行没有错误,但返回“0 行受影响”并且不更新任何数据。
谁能解释原因并提出可行的解决方案?
【问题讨论】:
发布样本数据和预期结果以阐明您想要什么。 @forpas 我添加了一些示例数据来澄清事情! 【参考方案1】:在正确的列上使用带有 ON 子句的正确连接,如下所示:
UPDATE wppp_term_relationships tr
JOIN wppp_terms t ON tr.term_taxonomy_id = t.term_id
SET tr.term_taxonomy_id = t.name
WHERE t.name REGEXP '^[0-9]*$';
请参阅demo。
【讨论】:
我正在尝试,但 mysql 返回“#1062 - Duplicate entry '5574-9' for key 'PRIMARY'”,但没有具有此值的条目... @LucasCave 查询仅更新列term_taxonomy_id
。是表wppp_term_relationships
的主键吗?
不,不是。 term_relationships 表的主键是 Object_id。也没有像 '5574-9' 这样的值......
@LucasCave 然后检查可能由于更新而运行的触发器。
在数据库上显示触发器不返回任何内容。以上是关于MYSQL:我想用另一个表中的值更新表中的所有行,其中第一个表中的值等于第二个表的主要内容,如果未能解决你的问题,请参考以下文章