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
但是,在你的情况下,如果我错了,你想更新 pmkManufacturer
而 pmkManufacturer
实际上是 INNER JOIN 的条件 ON
所以我不确定请求是否可以。如果没有,也不难,你可以添加一个新列:pmk_bis_manufacturer
并将值设置到该列中,然后删除旧列pmkManufacturer
,必要时更改新列的名称。
给你一个提示:列数据库的名称,我更喜欢设置:
pmk_manufacturer
而不是pmkManufacturer
因为名称中的大写字母 将来可能会出现一个问题。例如:对于 ORM 原则, 这不好:D
【讨论】:
以上是关于MySQL - 根据联接表列值更新列值的主要内容,如果未能解决你的问题,请参考以下文章