如何用单条SQL语句根据SELECT结果实现INSERT或UPDATE操作
解决方案:存在则更新,不存在则插入(Upsert)
原语句的问题:
- 语法错误:
COUNT(SELECT CQuantity FROM Inventory WHERE CBarcode = '00029218')写法违规,COUNT函数不能直接嵌套这类子查询,应该用EXISTS判断记录是否存在,或用COUNT(*)配合正确的子查询格式。 - 逻辑错误:条件
>1会导致只有当该条码的记录数大于1时才执行更新,不符合“只要存在就更新”的需求。
以下是主流数据库的正确实现方式:
MySQL/MariaDB
借助INSERT ... ON DUPLICATE KEY UPDATE语法,要求CBarcode字段为唯一键(UNIQUE KEY):
INSERT INTO Inventory (CBarcode, CQuantity) VALUES ('00029218', 1) ON DUPLICATE KEY UPDATE CQuantity = CQuantity + 1;
SQL Server/Azure SQL
使用MERGE语句:
MERGE Inventory AS target USING (SELECT '00029218' AS CBarcode) AS source ON (target.CBarcode = source.CBarcode) WHEN MATCHED THEN UPDATE SET target.CQuantity = target.CQuantity + 1 WHEN NOT MATCHED THEN INSERT (CBarcode, CQuantity) VALUES (source.CBarcode, 1);
PostgreSQL
使用INSERT ... ON CONFLICT语法,要求CBarcode有唯一约束:
INSERT INTO Inventory (CBarcode, CQuantity) VALUES ('00029218', 1) ON CONFLICT (CBarcode) DO UPDATE SET CQuantity = Inventory.CQuantity + 1;
Oracle
使用MERGE语句:
MERGE INTO Inventory target USING (SELECT '00029218' AS CBarcode FROM DUAL) source ON (target.CBarcode = source.CBarcode) WHEN MATCHED THEN UPDATE SET target.CQuantity = target.CQuantity + 1 WHEN NOT MATCHED THEN INSERT (CBarcode, CQuantity) VALUES (source.CBarcode, 1);
内容的提问来源于stack exchange,提问作者chris_techno25
相关产品推荐
相关产品推荐

