在重复键更新时插入忽略索引

时间:2017-07-05 14:07:35

标签: mysql on-duplicate-key

所以我有一个表product_supplier,我需要从import_tbl添加数据。 Product_supplier有三列product_id,supplier_id和price。 Import_tbl具有相同的列和一些额外的列。什么是最重要的,我无法工作的是,当product_id和supplier_id的特定组合存在时,只应更新价格。如果该组合不存在,则需要添加新行。我试过这个查询

INSERT INTO product_supplier (product_id, supplier_id, price)
SELECT i.product_id, i.supplier_id, i.price
FROM import_tbl i
ON DUPLICATE KEY UPDATE
    price = i.price

如果我添加一个带有新product_id的行,那么这个有效,但它完全忽略了supplier_id。因此,如果我使用相同的product_id但使用不同的supplier_id,则不会添加新行。

我认为这与索引有关,我为product_id和supplier_id以及product_id和supplier_id的多列索引尝试了唯一索引。但是,当我将EXPLAIN放在查询前面时,它永远不会识别任何索引。请一些帮助,谢谢!

product_supplier的表结构

+---------------------+---------+------+-----+---------+----------------+
|        Field        |  Type   | Null | Key | Default |     Extra      |
+---------------------+---------+------+-----+---------+----------------+
| product_supplier_id | int(11) | NO   | PRI | NULL    | auto_increment |
| product_id          | int(11) | NO   | UNI | 0       |                |
| supplier_id         | int(11) | NO   | MUL | 0       |                |
| price               | int(11) | NO   |     | 0       |                |
+---------------------+---------+------+-----+---------+----------------+

1 个答案:

答案 0 :(得分:0)

看起来你有一个关键问题。

“ON DUPLICATE KEY UPDATE”仅关注表的主键,在这种情况下是product_supplier_idproduct_id的组合主键。 product_supplier_id字段未包含在您的INSERT中,然后自动生成。

如果你真的想把这个提交作为一个动作(而不是检查现有,那么选择插入或更新),那么你需要将主键移动到基于product_id和supplier_id的组合,删除自动增量字段。

如果您需要为每个产品/供应商提供多个价格,那么您不能使用ON DUPLICATE KEY UPDATE并且需要运行多个查询。