【Oracle11g SQL详解】INSERT INTO 的用法及插入数据注意事项

news/2024/12/5 0:15:02/

INSERT INTO 的用法及插入数据注意事项

在 Oracle 11g 中,INSERT INTO 语句用于向表中插入数据,是数据写入操作中最常用的 SQL 语句之一。本文将详细介绍 INSERT INTO 的基本语法、常见场景、注意事项及常见错误处理。


一、INSERT INTO 的基本语法

INSERT INTO 支持两种基本用法:

  1. 指定列插入(推荐,明确指定列名,有助于维护性)。
  2. 完整插入(省略列名,插入所有列的值)。

1. 指定列插入
sql">INSERT INTO 表名 (列名1, 列名2, ...)
VALUES (1,2, ...);

示例:向 employees 表插入一个新员工记录

sql">INSERT INTO employees (employee_id, first_name, last_name, hire_date, salary)
VALUES (207, 'Tom', 'Hanks', TO_DATE('2024-11-26', 'YYYY-MM-DD'), 5500);

说明:

  • 需要严格按照列的顺序提供值。
  • 数据类型必须匹配列定义(如日期、数字、字符等)。

2. 完整插入
sql">INSERT INTO 表名
VALUES (1,2, ...);

示例:插入所有列数据

sql">INSERT INTO departments
VALUES (280, 'HR', 101, 1700);

注意:

  • 此用法会插入表中所有列的数据,因此必须提供表中所有列的值。
  • 表中定义了默认值或允许 NULL 的列可自动填充,但不推荐省略。

二、INSERT INTO 的变体
1. 插入多行数据

Oracle 支持通过多次 INSERT 实现批量插入,但不支持单条语句直接插入多行。

示例:批量插入多个员工记录

sql">INSERT INTO employees (employee_id, first_name, last_name, hire_date, salary)
VALUES (208, 'John', 'Doe', TO_DATE('2024-11-26', 'YYYY-MM-DD'), 6000);INSERT INTO employees (employee_id, first_name, last_name, hire_date, salary)
VALUES (209, 'Jane', 'Smith', TO_DATE('2024-11-26', 'YYYY-MM-DD'), 7200);

优化方式: 使用 PL/SQL 块或外部数据工具(如 SQL*Loader)实现批量插入。


2. 从其他表插入数据

通过 INSERT INTO ... SELECT 的方式将查询结果插入目标表。

sql">INSERT INTO 表名 (列名1, 列名2, ...)
SELECT 列名1, 列名2, ...
FROM 另一个表
[WHERE 条件];

示例:将 temp_employees 表中员工数据复制到 employees

sql">INSERT INTO employees (employee_id, first_name, last_name, hire_date, salary)
SELECT employee_id, first_name, last_name, hire_date, salary
FROM temp_employees
WHERE hire_date >= TO_DATE('2024-01-01', 'YYYY-MM-DD');

说明:

  • 确保目标表和源表的列类型匹配。
  • 可以配合 WHERE 子句实现条件插入。

3. 使用子查询插入默认值

当需要插入某些列的默认值时,可以使用子查询。

示例:插入新部门并设置默认值

sql">INSERT INTO departments (department_id, department_name, manager_id, location_id)
VALUES (290, 'Marketing', NULL, (SELECT location_id FROM locations WHERE city = 'New York'));

三、INSERT INTO 的常见注意事项
  1. 插入列顺序与数据匹配
    列的顺序必须与提供的值一一对应,否则可能出现错误。

    错误示例:

    sql">INSERT INTO employees (first_name, employee_id)
    VALUES (207, 'Tom'); -- 错误,列顺序不匹配
    
  2. 遵守表约束
    插入数据时需满足表的约束条件:

    • 主键 (PRIMARY KEY):禁止重复。
    • 唯一性约束 (UNIQUE):插入值必须唯一。
    • 非空约束 (NOT NULL):禁止插入空值。
    • 外键约束 (FOREIGN KEY):插入值必须在父表中存在。
  3. 数据类型匹配

    • 插入值需与列的数据类型一致,否则可能触发类型转换错误。
    • 日期类型值需使用 TO_DATE 转换。
  4. 性能优化建议

    • 批量插入建议使用 PL/SQL 批处理或外部工具,减少事务开销。
    • 插入前可禁用索引或触发器,完成后再启用,提升性能。

四、常见错误及解决方法
  1. 违反主键约束
    错误信息: ORA-00001: unique constraint violated
    原因: 插入了重复的主键值。
    解决方法:

    • 确认新插入的数据主键是否唯一。
    • 预先检查主键值是否已存在:
      sql">SELECT employee_id FROM employees WHERE employee_id = 207;
      
  2. 违反非空约束
    错误信息: ORA-01400: cannot insert NULL into ("列名")
    原因: 未为 NOT NULL 列提供值。
    解决方法: 提供必要的非空列值或修改表结构允许空值。

  3. 数据类型不匹配
    错误信息: ORA-01722: invalid number
    原因: 插入的值类型与列定义类型不匹配。
    解决方法: 检查并转换插入数据的类型。


五、实践案例
  1. 向表中插入一条完整记录

    sql">INSERT INTO employees 
    (employee_id, first_name, last_name, hire_date, salary, department_id)
    VALUES 
    (210, 'Alice', 'Brown', TO_DATE('2024-11-26', 'YYYY-MM-DD'), 8000, 10);
    
  2. 复制符合条件的数据到新表

    sql">INSERT INTO high_salary_employees (employee_id, first_name, last_name, salary)
    SELECT employee_id, first_name, last_name, salary
    FROM employees
    WHERE salary > 7000;
    
  3. 插入缺省值与计算结果

    sql">INSERT INTO departments (department_id, department_name, manager_id, location_id)
    VALUES (300, 'Research', NULL, (SELECT location_id FROM locations WHERE city = 'San Francisco'));
    

六、小结

INSERT INTO 是向表插入数据的核心 SQL 语句,适用于单行插入、批量插入以及基于查询的插入。正确使用 INSERT INTO 能有效地完成数据写入任务,而掌握其常见问题与优化方法则有助于避免错误并提高性能。


http://www.ppmy.cn/news/1552418.html

相关文章

详解Vue设计模式

详解 vue 设计模式 ​ Vue.js 作为一个流行的前端框架,拥有许多设计模式,这些设计模式帮助开发者更好地组织和管理代码,提升代码的可维护性、可扩展性和可读性。Vue 设计模式主要体现在以下几个方面: 1. 组件化设计模式 (Compon…

MATLAB不动点迭代法求单变量非线性方程的根程序加实例

不动点迭代法用于单变量线性方程近似根,首先确定一个方程根附近的近似初始值,采用逐次逼近的方法,使用迭代公式不断地更新这个初始值,使这个初始值不断趋近于准确值。 1.不动点迭代法自定义函数 fixed_point.m是一个MATLAB函数&a…

redis都有哪些用法

1. 缓存(Caching): • Redis常被用作缓存层,存储那些频繁访问但更新不频繁的数据,以减少数据库的访问压力,提高数据读取速度。 • LRU(Least Recently Used)淘汰策略:Red…

【SpringBoot】整合篇

1、log4j2 第一步&#xff0c;导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions><!-- 去掉springboot默认配置 --> <exclusion> <…

113. UE5 GAS RPG 实现传送点切换地图

接着我们优化体验相关&#xff0c;首先实现检查点可以在选中点击后&#xff0c;可以自动移动到目标检查点。然后增加一个可以提示玩家已经探索过相关区域的光柱&#xff0c;最后增加一个传送点&#xff0c;可以通过传送点传送到其它关卡。 实现点击自动移动到检查点 先实现点…

milvus 通俗易懂原理

向量值如何生成的 Milvus 是一个开源的向量数据库&#xff0c;专门用于处理高维向量的存储、搜索和分析。向量值本身通常来自于某些机器学习或深度学习模型的输出&#xff0c;尤其是在自然语言处理&#xff08;NLP&#xff09;、计算机视觉&#xff08;CV&#xff09;、推荐系…

数据结构有哪些?

常见的数据结构包括&#xff1a;数组、链表、栈、队列、树、堆、散列表&#xff08;哈希表&#xff09;等。‌ ‌数组‌&#xff1a;按照索引查询元素的速度很快&#xff0c;但大小固定&#xff0c;添加和删除元素需要移动其他元素&#xff0c;且只能存储一种类型的数据。‌链…

Spring Cloud Alibaba(六)

目录&#xff1a; 分布式链路追踪-SkyWalking为什么需要链路追踪什么是SkyWalkingSkyWalking核心概念什么是探针Java AgentJava探针日志监控实现之环境搭建Java探针日志监控实现之探针实现编写探针类TestAgent搭建 ElasticsearchSkyWalking服务环境搭建搭建微服务微服务接入Sky…