“主键重复”通常出现在数据库插入或更新数据时,因为主键(Primary Key)必须唯一、非空。处理方式取决于你的业务场景和技术栈,下面按常见情况给你总结:
插入前先判断是否存在
SELECT * FROM user WHERE id = 1001;
存在则更新,不存在则插入。
不同数据库写法不同:
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);
MySQL
INSERT IGNORE INTO user(id, name) VALUES(1001, 'Tom');
适合:日志、统计类数据。
try {
insert();
} catch (DuplicateKeyException e) {
update();
}
LOAD DATA + IGNORE| 场景 | 推荐方案 |
|---|---|
| 并发写入 | UPSERT |
| 日志数据 | INSERT IGNORE |
| 分布式系统 | UUID / Snowflake |
| 数据同步 | 先查后写 / MERGE |
如果你能告诉我:
我可以给你更精确的 SQL 或代码方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。