所以我有一个表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 | |
+---------------------+---------+------+-----+---------+----------------+
答案 0 :(得分:0)
看起来你有一个关键问题。
“ON DUPLICATE KEY UPDATE”仅关注表的主键,在这种情况下是product_supplier_id
加product_id
的组合主键。 product_supplier_id
字段未包含在您的INSERT中,然后自动生成。
如果你真的想把这个提交作为一个动作(而不是检查现有,那么选择插入或更新),那么你需要将主键移动到基于product_id和supplier_id的组合,删除自动增量字段。
如果您需要为每个产品/供应商提供多个价格,那么您不能使用ON DUPLICATE KEY UPDATE并且需要运行多个查询。