SQL 防重复插入:MySQL 与 PostgreSQL 的 Upsert 对照
|
freeflydom
2026年2月5日 15:48
本文热度 132
|
一句话承诺:一张对照表 + 两段语法,让你快速写出“有则更新,无则插入”。
语法对照表
| 数据库 | 语法 | 示例 |
|---|
| MySQL | INSERT … ON DUPLICATE KEY UPDATE | 依据唯一索引 |
| PostgreSQL | INSERT … ON CONFLICT (…) DO UPDATE | 指定冲突目标 |
MySQL 示例
CREATE TABLE users (
id BIGINT PRIMARY KEY,
email VARCHAR(255) UNIQUE,
name VARCHAR(64)
);
INSERT INTO users (id, email, name)
VALUES (1, 'a@ex.com', 'Alice')
ON DUPLICATE KEY UPDATE name=VALUES(name);
PostgreSQL 示例
CREATE TABLE users (
id BIGINT PRIMARY KEY,
email TEXT UNIQUE,
name TEXT
);
INSERT INTO users (id, email, name)
VALUES (1, 'a@ex.com', 'Alice')
ON CONFLICT (email) DO UPDATE SET name=EXCLUDED.name;
少量解释
- 选对冲突列:通常使用唯一索引列(如 email)。
- PG 的 EXCLUDED 引用待插入行;MySQL 的 VALUES(…) 引用插入值。
常见坑与替代法
- 坑:更新字段遗漏导致部分数据旧值保留。替代:明确列清单。
- 坑:并发高导致锁冲突。替代:必要时改为批量或队列处理。
转自https://blog.csdn.net/lxcxjxhx/article/details/153815053
该文章在 2026/2/5 15:48:07 编辑过