首页 > 解决方案 > 在 MySQL 中插入/更新多行的正确方法是什么?我做对了吗?

问题描述

我有一个看起来像这样的数据库:

id | product_id | tag
------------------------
1  | 10000      | tag1
------------------------
2  | 10000      | tag2 
------------------------
3  | 10000      | tag3
------------------------
4  | 10001      | tag2 
------------------------
5  | 10002      | tag1
------------------------
6  | 10002      | tag2 

每天我们都会检查 Web 服务以获取更新的标签列表,然后更新数据库。该数据库包含 50,000 种产品,因此我们一次只检查大约 100 种产品。

目前,当我检查每个产品(例如 product_id 10000)时,我将简单地删除所有行(DELETE FROM table WHERE product_id = 10000),然后一一插入所有标签。

我想知道是否有更好的方法可以做到这一点(我正在考虑类似于“插入...在重复键更新上...”我在插入单行时使用/更新。我最初的想法是插入它们,但如果我这样做,数据库将不知道标签是否已被删除)

我现在正在做的事情很好,但是这种事情一直出现,似乎应该有一种更好的方法来做到这一点,一种对数据库没有那么多调用的方法。

标签: mysqlinsert-update

解决方案


我不会删除/插入未更改为的标签:

  • ID 会改变(有时这可能很关键)
  • 可能是无缘无故执行的触发器

当然,在某些情况下删除/插入非常好,但这是我的一般规则:不要修改未更改的数据。

所以我在这种情况下的方法是:

DELETE FROM
    tags
WHERE
    product_id = 10000
    AND tag NOT IN ('tag1', 'tag2', 'tag3')
;

INSERT (...) VALUES (...), (...), ... ON DUPLICATE KEYS UPDATE ...

推荐阅读