### 3.3 插入数据的方法和语法
MySQL 提供多种方式向数据表中插入数据,主要包括 `INSERT INTO`、`REPLACE INTO` 等语句,适用于不同的业务场景。
#### 3.3.1 使用 `INSERT INTO` 插入数据
`INSERT INTO` 是最常用的插入数据方法,用于将新记录插入到指定表中。基本语法如下:
```sql
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
```
例如,向表 `users` 中插入一条记录:
```sql
INSERT INTO users (name, age, email)
VALUES ('Alice', 25, 'alice@example.com');
```
如果插入的值顺序与表中字段顺序一致,可以省略字段名:
```sql
INSERT INTO users
VALUES (NULL, 'Bob', 30, 'bob@example.com');
```
需要注意的是,如果插入的数据违反了主键或唯一索引约束,插入操作会失败,并抛出错误[^1]。
#### 3.3.2 使用 `REPLACE INTO` 插入或替换数据
`REPLACE INTO` 是 MySQL 特有的扩展语句,用于在插入数据时处理主键或唯一索引冲突的情况。其语法如下:
```sql
REPLACE INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
```
例如,当插入的数据与已有主键冲突时,`REPLACE INTO` 会先删除旧记录,再插入新记录:
```sql
REPLACE INTO users (id, name, age, email)
VALUES (1, 'Charlie', 28, 'charlie@example.com');
```
如果 `id = 1` 的记录已存在,则会被删除并替换为新记录。这种方式适用于需要确保数据唯一性并自动更新的场景[^1]。
#### 3.3.3 使用 `INSERT INTO ... ON DUPLICATE KEY UPDATE` 更新或插入数据
该语句是另一种处理主键或唯一索引冲突的方法,语法如下:
```sql
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...)
ON DUPLICATE KEY UPDATE column2 = value2, column3 = value3, ...;
```
例如:
```sql
INSERT INTO users (id, name, age, email)
VALUES (1, 'David', 22, 'david@example.com')
ON DUPLICATE KEY UPDATE name = 'David', age = 22, email = 'david@example.com';
```
如果 `id = 1` 的记录已存在,则不会删除整条记录,而是根据指定字段进行更新。这种方式在需要保留部分旧数据并更新部分字段时非常有用。
#### 3.3.4 批量插入数据
MySQL 支持一次插入多条记录,以提高插入效率。语法如下:
```sql
INSERT INTO table_name (column1, column2, column3, ...)
VALUES
(value1, value2, value3, ...),
(value4, value5, value6, ...),
...;
```
例如:
```sql
INSERT INTO users (name, age, email)
VALUES
('Eve', 29, 'eve@example.com'),
('Frank', 35, 'frank@example.com'),
('Grace', 27, 'grace@example.com');
```
这种方式适用于需要一次性导入大量数据的场景,可以显著减少数据库交互次数。
#### 3.3.5 从查询结果插入数据
还可以将查询结果插入到目标表中,语法如下:
```sql
INSERT INTO table_name (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM source_table
WHERE condition;
```
例如,将 `temp_users` 表中符合条件的数据插入到 `users` 表中:
```sql
INSERT INTO users (name, age, email)
SELECT name, age, email
FROM temp_users
WHERE age > 18;
```
这种方式适用于从临时表或其他表中迁移数据的场景。
---
###