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:我想用另一个表中的值更新表中的所有行,其中第一个表中的值等于第二个表的主要内容,如果未能解决你的问题,请参考以下文章

用另一个表中的值更新一个表

用另一个表中的随机条目更新表的列

更新表中所有行中的一列

使用同一列中的值更新表中的唯一列

更新 Mysql 表中的电子邮件

使用 SQL 更新 Spark 表中的列