MySQL - 根据联接表列值更新列值

Posted

技术标签:

【中文标题】MySQL - 根据联接表列值更新列值【英文标题】:MySQL - Update column value based on joined table column value 【发布时间】:2016-11-11 10:15:34 【问题描述】:

我一直在阅读 SO 和其他网站,并遵循了一些示例;但是,我的 SQL 语句仍然没有按要求执行。

我有两张桌子


          parts
============================
pmkParts    fnkManufacturer
----------------------------
   0          Penn-Union
   1          Schneider
   2         Telemecanique

         manufacturer   
===============================
Manufacturer    pmkManufacturer
-------------------------------
 Penn-Union          45
 Schneider           56
Telemecanique        12

我想把零件表改成

          parts
============================
pmkParts    fnkManufacturer
----------------------------
   0             45
   1             56
   2             12

这是我尝试过的 SQL 语句。

Update parts
SET parts.fnkManufacturer = (
   SELECT manufacturer.pmkManufacturer
   FROM manufacturer
   WHERE manufacturer.pmkManufacturer = parts.fnkManufacturer
   )

这改变了正确的列,但它用'NULLS'而不是外键(制造商)填充它。我认为那里应该有一个连接,但我不确定在哪里。

有什么建议吗?

---------

编辑:答案:

这是有效的 SQL 语句。感谢 MarcB 的帮助。

Update parts
SET parts.fnkManufacturer = (
   SELECT manufacturer.pmkManufacturer
   FROM manufacturer
   WHERE manufacturer.Manufacturer= parts.fnkManufacturer
   )

【问题讨论】:

这些字段是什么类型的?您不能将字符串字段/fk 更新为仍指向同一外部字段的整数。 @MarcB fnkManufacturer 是一个 varchar(50) 你不应该做where man.manufacturer = parts.fnkmanufac吗?您正在比较错误的字段,因此没有匹配项,并且您从子选择中得到空/空结果。 谢谢@MarcB .. 这是一个简单的解决方案。更改该行后,我的 SQL 语句就起作用了。 【参考方案1】:

尝试使用更新连接查询更改您的查询,如下所示。同样,您加入了错误的列,实际上您应该加入manufacturer.Manufacturer 列。

Update parts p
JOIN manufacturer m ON m.Manufacturer = p.fnkManufacturer
SET p.fnkManufacturer = m.pmkManufacturer;

【讨论】:

谢谢。我从未真正尝试过您的 SQL 语句,但您的评论是正确的。我比较了错误的列,一旦我修复它就很好。【参考方案2】:

您的pmkManufacturer 看起来像int,因此最好将新的int 字段添加到parts,更新它然后删除旧列。像这样。

alter table dbo.parts add pmkManufacturer int
update dbo.parts 
    set pmkManufacturer = m.pmkManufacturer 
from dbo.parts p
     inner join dbo.Manufacturer m on p.fnkManufacturer = m.manufacturer 

【讨论】:

感谢您的选择。目前我已经找到了一个解决方案,但你肯定有道理。在接下来的几周内,我可能不得不做同样的查询,然后再回顾一下。【参考方案3】:

最好的解决方案,你可以使用 INNER JOIN,例如:

update parts p
inner join manufacturer m on
    p.pmkManufacturer = m.Manufacturer
set p.pmkManufacturer = m.pmkManufacturer

但是,在你的情况下,如果我错了,你想更新 pmkManufacturerpmkManufacturer 实际上是 INNER JOIN 的条件 ON 所以我不确定请求是否可以。如果没有,也不难,你可以添加一个新列:pmk_bis_manufacturer并将值设置到该列中,然后删除旧列pmkManufacturer,必要时更改新列的名称。


给你一个提示:列数据库的名称,我更喜欢设置: pmk_manufacturer 而不是 pmkManufacturer 因为名称中的大写字母 将来可能会出现一个问题。例如:对于 ORM 原则, 这不好:D

【讨论】:

以上是关于MySQL - 根据联接表列值更新列值的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 根据更新其他表列值触发更新列值

MYSQL 根据表 2 的列值更新表 1 列

mysql如何根据一列值更新另一列的值?

基于 SQL Server 2008 中列值的内部联接

使用另一个列值更新 sql db 表列

用于检查工作表列值的 Google 脚本