mysql - 在 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),然后一一插入所有标签。
我想知道是否有更好的方法可以做到这一点(我正在考虑类似于“插入...在重复键更新上...”我在插入单行时使用/更新。我最初的想法是插入它们,但如果我这样做,数据库将不知道标签是否已被删除)
我现在正在做的事情很好,但是这种事情一直出现,似乎应该有一种更好的方法来做到这一点,一种对数据库没有那么多调用的方法。
解决方案
我不会删除/插入未更改为的标签:
- ID 会改变(有时这可能很关键)
- 可能是无缘无故执行的触发器
当然,在某些情况下删除/插入非常好,但这是我的一般规则:不要修改未更改的数据。
所以我在这种情况下的方法是:
DELETE FROM
tags
WHERE
product_id = 10000
AND tag NOT IN ('tag1', 'tag2', 'tag3')
;
INSERT (...) VALUES (...), (...), ... ON DUPLICATE KEYS UPDATE ...
推荐阅读
- python - 为什么 tkinter 不向我显示图像?
- php - 为什么这个 mysql 查询执行两次或有时三次?
- cassandra-3.0 - 如何使用 QueryBuilder 创建需要更新 UDT 值的更新语句
- python - 无法获得 Python 多处理数组输出的完整副本
- node.js - 在 AWS 上使用 Python 脚本调用 NodeJS 应用程序时未捕获(承诺)
- asp.net-core - 如何修复.net核心中的中间件问题
- python - 在按下 Enter 之前,带有 PIPE 标准输出的 Popen 不会退出
- typescript - 将一个目录中的所有文件分组到一个别名下
- java - 是否可以使用 replaceAll() 函数来创建一个在其上下文中包含 \n 的字符串?
- rust - 如何在等效枚举类型之间进行转换?