MySQL 的 INSERT(插入数据)详解

MySQL 的 INSERT(插入数据)详解

在 MySQL 中,INSERT 语句用于向数据库表中添加新的记录。INSERT 语句非常灵活,支持多种语法形式,可以根据具体需求选择合适的用法。以下是 INSERT 语句的详细语法和使用示例。

1. 插入单行数据
1.1 指定列名和值

这是最常见的 INSERT 语法,适用于插入单行数据。你需要指定列名和对应的值。

复制代码
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);

示例

假设我们有一个名为 users 的表,包含 id, username, email, birthdate, is_active 字段。我们想插入一条新记录:

复制代码
INSERT INTO users (username, email, birthdate, is_active)
VALUES ('test', 'test@runoob.com', '1990-01-01', true);
1.2 省略列名

如果你要插入的值涵盖了表中的所有列,可以省略列名部分。但请注意,值的顺序必须与表中列的顺序相同。

复制代码
INSERT INTO table_name
VALUES (value1, value2, value3, ...);

示例

假设 users 表的列顺序是 id, username, email, birthdate, is_active,并且 id 是自增列:

复制代码
INSERT INTO users
VALUES (NULL, 'test', 'test@runoob.com', '1990-01-01', true);
2. 插入多行数据
2.1 使用多个 VALUES 子句

你可以在 VALUES 子句中指定多组值,从而一次性插入多行数据。

复制代码
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...),
       (value1, value2, value3, ...),
       (value1, value2, value3, ...);

示例

复制代码
INSERT INTO users (username, email, birthdate, is_active)
VALUES ('test1', 'test1@runoob.com', '1985-07-10', true),
       ('test2', 'test2@runoob.com', '1988-11-25', false),
       ('test3', 'test3@runoob.com', '1993-05-03', true);
3. 使用 SELECT 语句插入数据
3.1 插入查询结果

你可以使用 SELECT 语句从其他表中选择数据并插入到目标表中。这对于数据迁移和归档非常有用。

复制代码
INSERT INTO target_table (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM source_table
WHERE condition;

示例

假设我们有两个表 employeessenior_employees,我们想将 employees 表中年龄大于 30 的员工信息插入到 senior_employees 表中:

复制代码
INSERT INTO senior_employees (id, name, age)
SELECT id, name, age
FROM employees
WHERE age > 30;
4. 条件插入
4.1 使用 INSERT IGNORE

如果你希望在插入数据时忽略已经存在的记录(即不抛出错误),可以使用 INSERT IGNORE

复制代码
INSERT IGNORE INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);

示例

复制代码
INSERT IGNORE INTO users (username, email, birthdate, is_active)
VALUES ('test', 'test@runoob.com', '1990-01-01', true);
4.2 使用 ON DUPLICATE KEY UPDATE

如果你希望在插入数据时遇到主键或唯一键冲突时更新现有记录,可以使用 ON DUPLICATE KEY UPDATE

复制代码
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...)
ON DUPLICATE KEY UPDATE
column1 = VALUES(column1),
column2 = VALUES(column2),
column3 = VALUES(column3);

示例

复制代码
INSERT INTO users (id, username, email, birthdate, is_active)
VALUES (1, 'test', 'test@runoob.com', '1990-01-01', true)
ON DUPLICATE KEY UPDATE
username = VALUES(username),
email = VALUES(email),
birthdate = VALUES(birthdate),
is_active = VALUES(is_active);
5. 使用 SET 语法插入数据
5.1 插入部分列的值

你可以使用 SET 语法来插入数据,这种方式更适用于需要明确指定列名和值的场景。

复制代码
INSERT INTO table_name
SET column1 = value1,
    column2 = value2,
    column3 = value3;

示例

复制代码
INSERT INTO users
SET username = 'test',
    email = 'test@runoob.com',
    birthdate = '1990-01-01',
    is_active = true;
6. 高级用法
6.1 使用 LOW_PRIORITY 修饰符

LOW_PRIORITY 修饰符会使 INSERT 语句延迟执行,直到没有其他客户端从表中读取数据。

复制代码
INSERT LOW_PRIORITY INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
6.2 使用 DELAYED 修饰符

DELAYED 修饰符适用于 MyISAM, MEMORYARCHIVE 表,使得 INSERT 语句立即返回,但实际插入操作可能稍后执行。

复制代码
INSERT DELAYED INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
注意事项
  1. 数据类型匹配:确保插入的数据类型与列定义一致,否则可能会导致错误。
  2. 唯一约束冲突 :插入的数据如果违反了唯一约束,可以使用 INSERT IGNOREON DUPLICATE KEY UPDATE 来处理。
  3. 性能优化 :对于大量数据的插入,可以采用批量插入的方式,并适当调整 MySQL 的配置参数,如 bulk_insert_buffer_size,以提高性能。

通过以上详细的介绍和示例,基本上能够熟练地使用 INSERT 语句在 MySQL 中插入数据。无论是基础的单行插入,还是高级的插入否则更新和数据迁移。

相关推荐
zhaoyong2226 小时前
CSS如何利用Less构建高度自定义组件_通过样式作用域防止冲突与溢出
jvm·数据库·python
消失的旧时光-19436 小时前
Android / IoT 面试复盘总结:从 MQTT、TLS 到 JWT 权限体系(标准答案 + 工程理解 + 延伸知识链)
android·物联网·面试
2301_781571426 小时前
Less如何优化CSS文件大小_利用压缩配置去除冗余样式
jvm·数据库·python
2401_867623986 小时前
Next.js 13 中为嵌套客户端组件实现局部加载状态的正确方法
jvm·数据库·python
weixin_444012936 小时前
CSS Flex布局中如何实现导航栏与Logo的左右分布_利用justify-content- space-between
jvm·数据库·python
彳亍1016 小时前
Less如何优化CSS文件大小_利用压缩配置去除冗余样式
jvm·数据库·python
m0_748554816 小时前
SQL如何防止JOIN查询导致数据库宕机_查询超时限制与资源管理
jvm·数据库·python
m0_748554817 小时前
React 中的渲染(Rendering)机制详解
jvm·数据库·python
SelectDB7 小时前
时间序列近邻关联性能实测:Doris ASOF JOIN 领先 ClickHouse、DuckDB
大数据·数据库·数据分析
Mike117.7 小时前
GBase 8c 逻辑复制槽停住以后,xlog 为什么越堆越多
数据库·oracle