如何用SQL实现TaxRate表:存在则更新税率、不存在则插入?
实现“存在则更新,不存在则插入”(UPSERT)的简便方法
这种需求在SQL里称为UPSERT,不需要写复杂的条件判断语句,主流数据库都提供了原生语法支持,前提是你的TaxRate表必须将邮编字段设置为唯一约束或主键,这样数据库才能识别重复记录。
以下是不同数据库的具体实现:
MySQL/MariaDB
使用INSERT ... ON DUPLICATE KEY UPDATE语法:
INSERT INTO TaxRate (邮编, 税率) VALUES ('100000', 0.03), ('200000', 0.05), ('300000', 0.02) ON DUPLICATE KEY UPDATE 税率 = VALUES(税率);
当插入的邮编已存在时,自动触发更新操作,将该邮编对应的税率替换为新值;若邮编不存在,则直接插入新记录。
PostgreSQL
使用INSERT ... ON CONFLICT语法:
INSERT INTO TaxRate (邮编, 税率) VALUES ('100000', 0.03), ('200000', 0.05), ('300000', 0.02) ON CONFLICT (邮编) DO UPDATE SET 税率 = EXCLUDED.税率;
ON CONFLICT (邮编)指定判断重复的字段,EXCLUDED代表待插入的那条记录,当冲突发生时,用新值更新现有记录的税率。
SQL Server
使用标准SQL的MERGE语句,也适用于其他支持该语法的数据库:
MERGE INTO TaxRate AS Target USING ( VALUES ('100000', 0.03), ('200000', 0.05), ('300000', 0.02) ) AS Source (邮编, 税率) ON Target.邮编 = Source.邮编 WHEN MATCHED THEN UPDATE SET Target.税率 = Source.税率 WHEN NOT MATCHED THEN INSERT (邮编, 税率) VALUES (Source.邮编, Source.税率);
该语句将目标表TaxRate与你提供的源数据关联,匹配到相同邮编时执行更新,未匹配到则执行插入。
注意事项
- 务必确保
邮编字段有唯一约束/主键,否则上述语句无法正确识别重复记录,可能导致插入重复数据或报错。 - 以上语法均支持批量操作,一次性处理多条记录,比逐条判断执行的效率更高。
内容的提问来源于stack exchange,提问作者D Clements
相关产品推荐
相关产品推荐

