如果密钥存在,则自动更新

时间:2011-10-16 12:22:28

标签: mysql sql

我有两张桌子

PARTSUPP - table

PS_PARTKEY
PS_SUPPKEY
PS_AVAILQTY
PS_SUPPLYCOST
PS_COMMENT
S_NAME

SUPPLIER - table

S_SUPPKEY
S_NAME
S_ADDRESS
S_NATIONKEY
S_PHONE
S_ACCTBAL
S_COMMENT

那我需要什么:

1 - 使用SUPPLIER.S_NAME迭代更新PARTSUPP.S_NAME,其中PARTSUPP.PS_SUPPKEY = SUPPLIER.S_SUPPKEY

3 个答案:

答案 0 :(得分:1)

您需要执行此类操作并且可能表明您的数据库设计存在缺陷,这是不寻常的。出于性能原因,您是否故意将模型非规范化(并在其他表中缓存SUPPLIER.S_NAME)?如果没有,请考虑更改设计(即删除冗余的PARTSUPP.S_NAME并在运行时使用JOIN)。

话虽这么说,你可以按照这样的要求进行更新:

UPDATE PARTSUPP
SET S_NAME = (
    SELECT S_NAME
    FROM SUPPLIER
    WHERE PARTSUPP.PS_SUPPKEY = SUPPLIER.S_SUPPKEY
)

答案 1 :(得分:1)

我认为你想要的是UPDATE PARTSUPP p SET S_NAME=(SELECT S_NAME FORM SUPPLIER s WHERE s.S_SUPPKEY=p.PS_SUPPKEY)

仍然你应该(如果拥有)删除partsuppp.s_name colum并在SELECT * FROM PARTSUPP LEFT JOIN SUPPLIER ON PS_SUPPKEY=S_SUPPKEY中找到需要它的查询 然后你不需要更新它(还有关于数据库设计的更多信息)

答案 2 :(得分:1)

也可以使用连接而不是内部查询来完成:

UPDATE FROM PARTSUPP ps
INNER JOIN SUPPLIER s ON s.S_SUPPKEY = ps.PS_SUPPKEY
SET ps.S_NAME = s.S_NAME
WHERE ps.S_NAME <> s.S_NAME