mysql - 防止具有多个值的 MySQL 重复插入自动递增
问题描述
当您尝试插入已经存在的行时,是否有一种公认的做法可以将不存在的值批量插入到表中而不自动递增?
单行插入案例有一个很好的答案: Prevent auto increment on MySQL duplicate insert
但是,为了提高插入效率,我想使用单个 SQL 命令插入大量行。(即:INSERT INTO myBigTable VALUES ((value1_row1,value2_row1),(value1_row2,value2_row2) ... )
附加信息:我希望所有 ID 都可用,因为我的表有可能变得非常大。将 auto_increment 变量大小更改为 BIGINT 将是最后的手段。我的插入应用程序将尝试定期插入大量已经存在的行(想想股票价格更新),因此我将有效地跳过大量自动递增的 ID。
为什么我使用自动增量:我相信为了查询速度,我应该在我的(非常大的)表中使用整数索引作为主键,而不是字符串字段的组合。我也相信我应该使用 auto_increment,所以 MySQL 会为我处理并发。
解决方案
您可以使用UNION
查询在另一个问题中使用该技术:
INSERT INTO yourTable (col1, col2, ...)
SELECT $row1_value1, $row1_value2, ...
FROM DUAL
WHERE NOT EXISTS (
SELECT 1
FROM yourTable
WHERE unique_col = $row1_value1)
UNION ALL
SELECT $row2_value1, $row2_value2, ...
FROM DUAL
WHERE NOT EXISTS (
SELECT 1
FROM yourTable
WHERE unique_col = $row2_value1)
UNION ALL
SELECT $row3_value1, $row3_value2, ...
FROM DUAL
WHERE NOT EXISTS (
SELECT 1
FROM yourTable
WHERE unique_col = row1_value1)
UNION ALL
SELECT $row4_value1, $row4_value2, ...
FROM DUAL
WHERE NOT EXISTS (
SELECT 1
FROM yourTable
WHERE unique_col = $row4_value1)
推荐阅读
- c# - 如何在复选框周围添加效果
- azure - 将端点 VPN 客户端连接到 azure 中的多个 vnet
- r - 当A列数据最大时如何从B列中提取数据?在 R 中
- python - 如何在 selenium python 中同时使用多个浏览器实例?
- html - 按钮浮动到输入表单 HTML 的右侧
- dialog - Blazor 同步确认同步融合
- ios - 请帮助更好地了解崩溃。崩溃细节:在 iOS 14、Xcode 12 上使用 Core Data
- javascript - 如何播放 .m4s 文件。并将它们转换为 Discord Bot 的二进制流
- grails - grails dbm-update 有时会给出 groovy.lang.MissingMethodException
- ruby - 如何为排序添加默认值:在 query_type.rb