如何在PLSQL中实现带存在性校验的条件INSERT插入操作
解决方案
方案1:全数据库兼容写法(无需修改表结构)
通过NOT EXISTS子查询做存在性校验,直接在原有SELECT逻辑中增加过滤条件即可,适配MySQL、PostgreSQL、Oracle、SQL Server等所有主流关系型数据库:
INSERT INTO states(state_name, cust_id) SELECT 'Sleeping', c.cust_id FROM customer c WHERE NOT EXISTS ( SELECT 1 FROM states s WHERE s.cust_id = c.cust_id AND s.state_name = 'Sleeping' );
逻辑说明:子查询会逐行校验当前客户是否已经存在state_name为Sleeping的记录,仅当不存在对应记录时,该行数据才会被选中执行插入。
方案2:性能优化写法(需添加唯一约束)
如果你的业务场景允许修改states表结构,建议给state_name和cust_id加联合唯一索引,插入性能会比子查询更高,适合数据量较大的场景:
- 先添加联合唯一索引:
ALTER TABLE states ADD UNIQUE KEY `uniq_state_cust` (`state_name`, `cust_id`);
- 插入语句可直接使用数据库自带的冲突跳过逻辑,以MySQL为例:
INSERT IGNORE INTO states(state_name, cust_id) SELECT 'Sleeping', cust_id FROM customer;
逻辑说明:当插入数据违反唯一约束(即对应客户的Sleeping状态记录已存在)时,INSERT IGNORE会自动跳过冲突行,不会抛出错误也不会生成重复数据。
内容的提问来源于stack exchange,提问作者Java Programmer
相关产品推荐
相关产品推荐

