SQL MERGE UPSERT 操作
SQL MERGE(UPSERT/INSERT OR UPDATE):MERGE INTO target USING source ON condition WHEN MATCHED THEN UPDATE WHEN NOT MATCHED THEN INSERT、不同数据库实现差异(MySQL INSERT...ON DUPLICATE KEY)、PostgreSQL INSERT...ON C · 难度:入门 · +10XP
SQL UPSERT —— 存在则更新,不存在则插入
UPSERT(UPDATE + INSERT)是最常见的数据库操作之一。不同数据库有不同的实现方式。
MySQL
INSERT INTO users (id, name, email)
VALUES (1, '小明', 'xiaoming@example.com')
ON DUPLICATE KEY UPDATE name=VALUES(name), email=VALUES(email);
PostgreSQL / SQLite
INSERT INTO users (id, name, email)
VALUES (1, '小明', 'xiaoming@example.com')
ON CONFLICT (id) DO UPDATE SET name=EXCLUDED.name, email=EXCLUDED.email;
SQL Server / Oracle
MERGE INTO users AS target
USING (VALUES (1, '小明', 'xiaoming@example.com')) AS source(id, name, email)
ON target.id = source.id
WHEN MATCHED THEN UPDATE SET name=source.name, email=source.email
WHEN NOT MATCHED THEN INSERT (id, name, email) VALUES (source.id, source.name, source.email);
动手练习
- 基础练习:实现一个用户登录日志——同一天同用户多条记录则更新最后登录时间。
- 进阶应用:用UPSERT实现批量导入——新数据插入,已有数据更新。
- 项目实战:把项目中的先SELECT再判断INSERT/UPDATE的逻辑改为UPSERT。