<think>我们正在讨论数据库操作中的INSERT INTO语句,特别是单条和多条数据插入的方法。根据用户的问题,用户希望了解如何执行单条和多条INSERT语句来新增数据。
根据提供的引用,我们可以总结出以下几种插入数据的方法:
1. 单条插入:使用INSERT INTO ... VALUES ... 语句插入一行数据。
2. 多条插入(方法1):使用INSERT INTO ... VALUES ... 后跟多个用逗号分隔的值列表,一次性插入多行数据(如引用[3]所示)。
3. 多条插入(方法2):使用INSERT INTO ... SELECT ... UNION ALL ... 的方式,通过查询结果插入多行数据(如引用[1]所示)。
4. 多条插入(方法3):使用INSERT INTO ... SELECT ... 从另一个表中选择数据插入(如引用[1]所示)。
下面我们将详细说明这些方法。
### 单条数据插入
单条插入是最基本的形式,语法如下:
```sql
INSERT INTO 表名 (列1, 列2, 列3, ...)
VALUES (值1, 值2, 值3, ...);
```
例如,向`user_info`表中插入一条用户信息:
```sql
INSERT INTO user_info (user_account, user_name, user_age, user_class)
VALUES ('00001', '张三', 20, '计算机系');
```
### 多条数据插入
如果需要一次性插入多条数据,可以使用以下方法:
#### 方法1:使用单个INSERT语句和多个VALUES子句(推荐)
这是最常用的多条插入方法,语法如下:
```sql
INSERT INTO 表名 (列1, 列2, 列3, ...)
VALUES
(值1a, 值2a, 值3a, ...),
(值1b, 值2b, 值3b, ...),
...;
```
例如,向`user_info`表中插入三条记录:
```sql
INSERT INTO user_info (user_account, user_name, user_age, user_class)
VALUES
('00001', '张三', 20, '计算机系'),
('00002', '李四', 19, '计算机系'),
('00003', '王五', 21, '数学系');
```
这种方法在大多数数据库系统(如MySQL, SQL Server, PostgreSQL等)中都支持,且效率较高。
#### 方法2:使用UNION ALL结合SELECT
这种方法适用于一些不支持上述多条插入语法的数据库(如旧版本的SQL Server),或者需要从其他表或表达式中构造数据的情况。语法如下:
```sql
INSERT INTO 表名 (列1, 列2, 列3, ...)
SELECT 值1a, 值2a, 值3a, ... UNION ALL
SELECT 值1b, 值2b, 值3b, ... UNION ALL
...
```
例如:
```sql
INSERT INTO user_info (user_account, user_name, user_age, user_class)
SELECT '00001', '张三', 20, '计算机系' UNION ALL
SELECT '00002', '李四', 19, '计算机系' UNION ALL
SELECT '00003', '王五', 21, '数学系';
```
注意:这种方法在插入大量数据时性能可能不如方法1,因为每个SELECT UNION ALL都会被视为一个单独的查询,然后合并。
#### 方法3:从另一个表中选择数据插入
如果数据已经存在于另一个表中,可以使用INSERT INTO ... SELECT ... 语句。例如:
```sql
INSERT INTO user_info (user_account, user_name, user_age, user_class)
SELECT account, name, age, class
FROM temp_user;
```
这里,`temp_user`是另一个表,我们从中选取数据插入到`user_info`表中。
### 注意事项
1. 列的顺序和数量必须与VALUES子句中的值顺序和数量一致。
2. 如果省略列名,则VALUES子句中必须提供表中所有列的值,且顺序与表定义一致。
3. 插入时需注意数据类型匹配和约束(如主键唯一性、非空约束等)。
### 总结
根据实际需求选择插入方式:
- 单条插入:适用于插入单条记录。
- 多条插入(方法1):适用于一次性插入多条记录,简洁高效。
- 多条插入(方法2):在特定情况下使用,如旧版本数据库或不支持方法1的情况。
- 从其他表插入:适用于数据迁移或复制。
希望这些方法能帮助您高效地完成数据插入操作。
§§相关问题§§
1. 在插入多条数据时,如果有一条数据插入失败,会发生什么?
2. 如何提高大批量数据插入的性能?
3. 不同数据库(如MySQL、SQL Server、Oracle)在插入多条数据时的语法差异?</think>### 数据库 INSERT INTO VALUES 单条与多条数据插入方法
#### 一、单条数据插入
语法格式:
```sql
INSERT INTO 表名 (字段1, 字段2, ...)
VALUES (值1, 值2, ...);
```
**示例**:
```sql
-- 插入单条用户数据
INSERT INTO user_info (user_account, user_name, user_age)
VALUES ('U1001', '张三', 25);
```
> 特点:每次执行仅插入一行数据,适合零星数据操作[^1]。
#### 二、多条数据插入
##### 方法1:VALUES 多值列表(推荐)
```sql
INSERT INTO 表名 (字段1, 字段2, ...)
VALUES
(值1a, 值2a, ...),
(值1b, 值2b, ...),
...;
```
**示例**:
```sql
-- 一次性插入3条学生记录
INSERT INTO students (stu_id, name, major)
VALUES
('S2023', '李四', '计算机'),
('S2024', '王五', '数学'),
('S2025', '赵六', '物理');
```
> ✅ 优势:单条SQL完成批量插入,效率最高[^3]。
##### 方法2:UNION ALL 联合查询
```sql
INSERT INTO 表名 (字段1, 字段2, ...)
SELECT '值1a', '值2a' UNION ALL
SELECT '值1b', '值2b' UNION ALL
...;
```
**示例**:
```sql
-- 插入多门课程信息
INSERT INTO courses (course_id, course_name)
SELECT 'C101', '数据库' UNION ALL
SELECT 'C102', '算法' UNION ALL
SELECT 'C103', '网络';
```
> ⚠️ 注意:适用于旧版数据库(如SQL Server 2000)[^1]。
##### 方法3:从其他表复制数据
```sql
INSERT INTO 目标表 (字段1, 字段2, ...)
SELECT 字段1, 字段2, ...
FROM 源表 WHERE 条件;
```
**示例**:
```sql
-- 从临时表导入数据
INSERT INTO employees (emp_id, dept)
SELECT temp_id, department
FROM temp_hire WHERE status = 'approved';
```
### 关键注意事项
1. **字段顺序**:VALUES中的值顺序必须与字段声明顺序一致
2. **省略字段**:若省略字段列表,需提供所有字段值(含自增ID)
3. **性能对比**:
- 插入100行数据时,多值列表比单条插入快10倍以上
- UNION ALL方式会有额外解析开销
4. **事务控制**:
```sql
BEGIN TRANSACTION;
INSERT INTO ... -- 批量操作
COMMIT; -- 确保原子性
```
### 不同数据库语法差异
| 数据库 | 多值列表支持 | 最大单次插入行数 |
|--------------|--------------|------------------|
| MySQL 8.0 | ✅ | 受max_allowed_packet限制 |
| SQL Server | ✅ | 1000(建议分批) |
| PostgreSQL | ✅ | 无硬性限制 |
| Oracle 12c+ | ✅ | 1000(推荐BULK INSERT)|
> 实际开发中优先使用多值列表法,兼顾效率与可读性[^2][^3]。