温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

主键重复如何处理

发布时间:2026-09-03 02:05:28 来源:亿速云 阅读:84 作者:小樊 栏目:数据库

“主键重复”通常出现在数据库插入或更新数据时,因为主键(Primary Key)必须唯一非空。处理方式取决于你的业务场景和技术栈,下面按常见情况给你总结:


一、为什么会主键重复?

  • 手动指定了已存在的主键值
  • 自增主键失效或重置
  • 并发插入
  • 数据同步 / 导入历史数据

二、常见处理方案

✅ 1. 避免重复(推荐)

插入前先判断是否存在

SELECT * FROM user WHERE id = 1001;

存在则更新,不存在则插入。


✅ 2. 使用“存在则更新”(UPSERT)

不同数据库写法不同:

MySQL

INSERT INTO user(id, name) VALUES(1001, 'Tom')
ON DUPLICATE KEY UPDATE name = 'Tom';

PostgreSQL

INSERT INTO user(id, name) VALUES(1001, 'Tom')
ON CONFLICT (id) DO UPDATE SET name = 'Tom';

SQL Server

MERGE INTO user AS target
USING (SELECT 1001 AS id, 'Tom' AS name) AS source
ON target.id = source.id
WHEN MATCHED THEN UPDATE SET name = source.name
WHEN NOT MATCHED THEN INSERT (id, name) VALUES (source.id, source.name);

✅ 3. 忽略重复数据

MySQL

INSERT IGNORE INTO user(id, name) VALUES(1001, 'Tom');

适合:日志、统计类数据。


✅ 4. 使用自增 / UUID 主键(防重复)

  • 自增 ID(简单但不适合分布式)
  • UUID / Snowflake(分布式系统推荐)

✅ 5. 捕获异常后处理(代码层)

try {
    insert();
} catch (DuplicateKeyException e) {
    update();
}

✅ 6. 批量导入时处理

  • 先删后插(谨慎)
  • 临时表 + 去重
  • 使用 LOAD DATA + IGNORE

三、如何选方案?

场景 推荐方案
并发写入 UPSERT
日志数据 INSERT IGNORE
分布式系统 UUID / Snowflake
数据同步 先查后写 / MERGE

如果你能告诉我:

  • 用的什么数据库(MySQL / PG / Oracle)
  • 是插入还是导入
  • 是否允许覆盖

我可以给你更精确的 SQL 或代码方案

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI