在 Oracle 11g 中,INSERT INTO
语句用于向表中插入数据,是数据写入操作中最常用的 SQL 语句之一。本文将详细介绍 INSERT INTO
的基本语法、常见场景、注意事项及常见错误处理。
INSERT INTO
支持两种基本用法:
INSERT INTO 表名 (列名1, 列名2, ...)
VALUES (值1, 值2, ...);
示例:向 employees
表插入一个新员工记录
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);
说明:
INSERT INTO 表名
VALUES (值1, 值2, ...);
示例:插入所有列数据
INSERT INTO departments
VALUES (280, 'HR', 101, 1700);
注意:
NULL
的列可自动填充,但不推荐省略。Oracle 支持通过多次 INSERT
实现批量插入,但不支持单条语句直接插入多行。
示例:批量插入多个员工记录
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)实现批量插入。
通过 INSERT INTO ... SELECT
的方式将查询结果插入目标表。
INSERT INTO 表名 (列名1, 列名2, ...)
SELECT 列名1, 列名2, ...
FROM 另一个表
[WHERE 条件];
示例:将 temp_employees
表中员工数据复制到 employees
表
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
子句实现条件插入。当需要插入某些列的默认值时,可以使用子查询。
示例:插入新部门并设置默认值
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 employees (first_name, employee_id)
VALUES (207, 'Tom'); -- 错误,列顺序不匹配
遵守表约束
插入数据时需满足表的约束条件:
PRIMARY KEY
):禁止重复。UNIQUE
):插入值必须唯一。NOT NULL
):禁止插入空值。FOREIGN KEY
):插入值必须在父表中存在。数据类型匹配
TO_DATE
转换。性能优化建议
PL/SQL
批处理或外部工具,减少事务开销。违反主键约束
错误信息: ORA-00001: unique constraint violated
原因: 插入了重复的主键值。
解决方法:
确认新插入的数据主键是否唯一。
预先检查主键值是否已存在:
SELECT employee_id FROM employees WHERE employee_id = 207;
违反非空约束
错误信息: ORA-01400: cannot insert NULL into ("列名")
原因: 未为 NOT NULL
列提供值。
解决方法: 提供必要的非空列值或修改表结构允许空值。
数据类型不匹配
错误信息: ORA-01722: invalid number
原因: 插入的值类型与列定义类型不匹配。
解决方法: 检查并转换插入数据的类型。
向表中插入一条完整记录
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);
复制符合条件的数据到新表
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;
插入缺省值与计算结果
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
能有效地完成数据写入任务,而掌握其常见问题与优化方法则有助于避免错误并提高性能。