使用SELECT语句向表中插入数据的SQL实现及建议咨询
SQL插入语句优化与正确性建议
正确性检查
- 字段匹配:你的语句中插入字段和SELECT返回字段的顺序、数据类型完全匹配,这部分没问题。但
userid生成逻辑里的substr(FIRST_NAME,1,1)||''||substr(LAST_NAME,1,7)存在冗余,空字符串拼接毫无意义,直接写成substr(FIRST_NAME,1,1)||substr(LAST_NAME,1,7)即可,结果完全一致。 - ID唯一性验证:如果
ID是表的主键或带有唯一约束,必须确保表中不存在3、4这两个ID值,否则执行时会触发唯一性冲突报错。
优化建议
- 替换UNION为UNION ALL:你插入的两条数据ID明确不同,不存在重复可能,用
UNION ALL可以跳过数据库的重复数据校验步骤,提升执行效率,插入数据量越多,效率差异越明显。 - 简化多数据行插入写法:Oracle中插入多条固定值数据,没必要拆成多个SELECT再拼接,改成子查询聚合的方式结构更清晰,维护更方便,示例如下:
INSERT into HR.my_employees (ID,LAST_NAME,FIRST_NAME,userid,SALARY) SELECT id, last_name, first_name, substr(first_name,1,1)||substr(last_name,1,7) AS userid, salary FROM ( SELECT 3 AS id, 'Biri' AS last_name, 'Ben' AS first_name, 1100 AS salary FROM dual UNION ALL SELECT 4 AS id, 'Newman' AS last_name, 'Chad' AS first_name, 750 AS salary FROM dual );
如果使用Oracle 12c及以上版本,还能采用更简洁的写法:
INSERT into HR.my_employees (ID,LAST_NAME,FIRST_NAME,userid,SALARY) SELECT id, last_name, first_name, substr(first_name,1,1)||substr(last_name,1,7) AS userid, salary FROM ( VALUES (3, 'Biri', 'Ben', 1100), (4, 'Newman', 'Chad', 750) ) t(id, last_name, first_name, salary);
- 统一字段大小写:Oracle中未用双引号定义的字段默认是大写,你语句里使用了小写的
userid、salary,虽然Oracle不区分大小写,但建议和表结构定义的写法保持一致,避免潜在问题。
内容的提问来源于stack exchange,提问作者Jony_Junior
相关产品推荐
相关产品推荐

