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 中插入数据。无论是基础的单行插入,还是高级的插入否则更新和数据迁移。

相关推荐
这个DBA有点耶2 小时前
NULL不是空——数据库里最反直觉的设计,90%新人踩过的坑
数据库·mysql·代码规范
杉氧3 小时前
Navigation Compose 深度实践:如何优雅地串联起你的全栈 App?
android·架构·android jetpack
这个DBA有点耶4 小时前
AI写的SQL跑崩了生产库,这锅谁背?
数据库·人工智能·程序员
镜舟科技5 小时前
Databricks 再提 LTAP,AI 时代的数据底座为何重回大一统叙事?
数据库·架构·agent
Databend6 小时前
从湖仓升级为 Agent 时代的数据控制面,Snowflake 和 Databricks 有哪些布局
大数据·数据库·agent
雨白7 小时前
指针与数组的核心机制
android
ClouGence9 小时前
SQL Server CDC 能放到 Always On 备库读吗?一文讲透原理与实践
数据库·sql server
黄林晴11 小时前
Room 3.0 正式发布!包名彻底重构,KMP 成为核心主线
android·android jetpack
三少爷的鞋12 小时前
Kotlin 协程环境下的 DCL 懒加载:别把线程时代的经验直接搬过来
android
plainGeekDev12 小时前
Gson → kotlinx.serialization
android·java·kotlin