首页 > 解决方案 > 防止具有多个值的 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 会为我处理并发。

标签: mysqlinsertauto-increment

解决方案


您可以使用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)

推荐阅读