MySQL跨表更新

时间:2015-03-06 14:52:02

标签: mysql sql

伙计我有一个MySQL数据库表我试图填写另一个表中的数据但是映射到一个公共代码。

例如:

UPDATE signs_labels_products p 
SET p.ebay_cat_id = (
    SELECT c.ebay_cat_id
    FROM signs_labels_ebay_categories_by_signcode c
    WHERE p.SignCode = c.sign_code
)
WHERE p.ebay_cat_id = '' OR p.ebay_cat_id IS NULL LIMIT 5000;

运行良好但缓慢(因此限制条款)。

我遇到的问题是我打算同时填写其他字段,例如:

UPDATE signs_labels_products p 
SET p.ebay_cat_id =    (SELECT c.ebay_cat_id
                        FROM signs_labels_ebay_categories_by_signcode c
                        WHERE p.SignCode = c.sign_code),
    p.ebay_category =  (SELECT c.ebay_category
                        FROM signs_labels_ebay_categories_by_signcode c
                        WHERE p.SignCode = c.sign_code),
    p.store_category = (SELECT c.store_category
                        FROM signs_labels_ebay_categories_by_signcode c
                        WHERE p.SignCode = c.sign_code)
WHERE p.ebay_cat_id = '' OR p.ebay_cat_id IS NULL LIMIT 5000;

这不是最好的,而且肯定会更加整洁,以为我会问你们的意见和帮助。

任何改进都非常感谢:)

无论如何,感谢阅读。

JB

2 个答案:

答案 0 :(得分:2)

为什么不使用JOIN而不是子查询

UPDATE signs_labels_products p 
join signs_labels_ebay_categories_by_signcode c on c.sign_code = p.SignCode
set 
p.ebay_cat_id = c.ebay_cat_id,
p.ebay_category = c.ebay_category,
p.store_category = c.store_category
WHERE p.ebay_cat_id = '' OR p.ebay_cat_id IS NULL

确保加入密钥已编入索引,如果不是

alter table signs_labels_products add index SignCode_idx(SignCode);
alter table signs_labels_ebay_categories_by_signcode 
add index sign_code_idx(sign_code)

答案 1 :(得分:0)

UPDATE signs_labels_products p 
inner join signs_labels_ebay_categories_by_signcode c 
on p.SignCode = c.sign_code
SET 
    p.ebay_cat_id =   c.ebay_cat_id   ,
    p.ebay_category =   c.ebay_category ,
    p.store_category = c.store_category                   
WHERE p.ebay_cat_id = '' OR p.ebay_cat_id IS NULL LIMIT 5000;