INSERT INTO 命令简介
INSERT INTO 语句用于向数据库表中插入新的行数据。

基本语法:插入完整的行
这是最简单的用法,你需要按照表结构中列的顺序,提供所有列的值。
语法
INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...);
table_name: 你要插入数据的表名。(column1, column2, ...): 可选的列名列表,如果省略,MySQL 会假设你要为表中的所有列按顺序插入数据。VALUES (value1, value2, ...): 对应列的值列表,值的顺序和数量必须与列名列表完全匹配。
示例
假设我们有一个 students 表,结构如下:
CREATE TABLE students (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT,
enrollment_date DATE
);
示例 1:明确指定列名
这是推荐的做法,因为它更具可读性,并且在表结构发生变化时(比如增加新列)不容易出错。

INSERT INTO students (name, age, enrollment_date)
VALUES ('张三', 20, '2025-09-01');
示例 2:省略列名(不推荐,但需了解)
如果你为表中的所有列都提供值,并且值的顺序与表创建时的列顺序完全一致,可以省略列名。
-- 假设表顺序是 id, name, age, enrollment_date -- 因为 id 是自增的,我们通常不手动插入它 INSERT INTO students VALUES (NULL, '李四', 21, '2025-09-02');
注意:
id列是AUTO_INCREMENT的,所以我们通常插入NULL或DEFAULT,让数据库自动生成一个唯一的 ID,直接省略id列并只提供其他列的值是更常见的做法,但语法上需要明确列出要插入的列。
插入部分列
如果你的表有很多列,但你只想为其中一部分列插入数据,其他列有 DEFAULT 值或允许 NULL,这是完全可行的。

示例
我们只为 name 和 enrollment_date 插入数据,age 将为 NULL。
INSERT INTO students (name, enrollment_date)
VALUES ('王五', '2025-09-03');
执行后,age 列的值会是 NULL。
插入多行数据
你可以使用一个 INSERT INTO 语句一次性插入多行数据,这比多次执行单行插入语句效率更高。
语法
INSERT INTO table_name (column1, column2, ...)
VALUES
(value1_a, value2_a, ...),
(value1_b, value2_b, ...),
(value1_c, value2_c, ...);
示例
INSERT INTO students (name, age, enrollment_date)
VALUES
('赵六', 22, '2025-09-04'),
('钱七', 19, '2025-09-05'),
('孙八', 23, '2025-09-06');
从另一个表插入数据 (INSERT INTO ... SELECT)
你可以从一个表中选择数据,然后将这些数据插入到另一个表中,两个表的列结构(数量、数据类型)需要兼容。
语法
INSERT INTO target_table (column1, column2, ...) SELECT column1, column2, ... FROM source_table WHERE condition; -- WHERE 子句是可选的
示例
假设我们有一个 alumni (校友) 表,结构和 students 表一样,现在我们要将年龄大于 22 岁的学生转移到 alumni 表中。
-- 假设 alumni 表已经存在且结构相同 INSERT INTO alumni (name, age, enrollment_date) SELECT name, age, enrollment_date FROM students WHERE age > 22;
使用 SET 语法插入数据
这是 INSERT 的另一种语法形式,功能与 VALUES 类似,但更灵活,特别是在进行更新操作时(如 ON DUPLICATE KEY UPDATE)。
语法
INSERT INTO table_name SET column1 = value1, column2 = value2, ...;
示例
INSERT INTO students SET name = '周九', age = 24, enrollment_date = '2025-09-07';
重要注意事项和最佳实践
-
数据类型匹配
- 插入的值必须与列定义的数据类型兼容,你不能将字符串
'abc'插入到INT类型的列中。 - 日期和时间值应该使用正确的格式,如
'YYYY-MM-DD'或'YYYY-MM-DD HH:MM:SS'。
- 插入的值必须与列定义的数据类型兼容,你不能将字符串
-
字符串和日期值需要用单引号
- 在 SQL 中,字符串、日期和时间类型的值必须用单引号 () 括起来,数字类型的值则不需要。
- 错误示例:
INSERT INTO students (name) VALUES (张三); - 正确示例:
INSERT INTO students (name) VALUES ('张三');
-
处理
AUTO_INCREMENT列- 对于自增列,通常不要手动指定值,在插入时,可以插入
NULL、DEFAULT或者直接省略该列,让数据库自动处理。
- 对于自增列,通常不要手动指定值,在插入时,可以插入
-
处理
NULL值- 如果某列允许为
NULL,你可以直接在VALUES子句中写入NULL。 - 如果某列有
NOT NULL约束,则必须为其提供一个值,否则插入会失败。
- 如果某列允许为
-
使用
ON DUPLICATE KEY UPDATE(处理重复键)- 当你尝试插入的行与表中已有的行的主键或唯一索引冲突时,默认会报错,使用这个子句可以让你在冲突时更新现有行而不是报错。
- 这通常被称为 "INSERT ... ON DUPLICATE KEY UPDATE" 或 "upsert" (update or insert)。
示例
假设
students表的name列有UNIQUE约束,我们想插入一个学生,如果已存在同名学生,则更新其年龄。INSERT INTO students (name, age, enrollment_date) VALUES ('张三', 25, '2025-01-01') ON DUPLICATE KEY UPDATE age = 25;name为 '张三' 的记录不存在,则插入一条新记录。name为 '张三' 的记录已存在,则将该记录的age更新为 25。
-
使用
INSERT IGNORE(忽略错误)- 如果你想尝试插入数据,但如果因为主键/唯一键冲突等原因导致失败,就静默忽略这个错误而不是报错,可以使用
INSERT IGNORE。 - 注意: 它会忽略所有类型的错误,而不仅仅是重复键错误。
示例
INSERT IGNORE INTO students (name, age) VALUES ('张三', 26);'张三' 已存在,这条语句不会执行任何操作,也不会报错。
- 如果你想尝试插入数据,但如果因为主键/唯一键冲突等原因导致失败,就静默忽略这个错误而不是报错,可以使用
| 功能 | SQL 语句示例 | 说明 |
|---|---|---|
| 单行插入 | INSERT INTO students (name, age) VALUES ('张三', 20); |
最基础、最常用的用法。 |
| 多行插入 | INSERT INTO students ... VALUES (...), (...), (...); |
一次性插入多行,效率更高。 |
| 部分列插入 | INSERT INTO students (name) VALUES ('李四'); |
其他允许 NULL 的列将自动填充为 NULL。 |
| 从表插入 | INSERT INTO alumni SELECT ... FROM students WHERE ...; |
用于数据迁移或复制。 |
| 插入或更新 | INSERT ... ON DUPLICATE KEY UPDATE age = 25; |
处理主键/唯一键冲突的强大功能。 |
| 忽略错误 | INSERT IGNORE INTO ... |
如果插入失败(如重复键),则静默跳过。 |
希望这份详细的指南能帮助你全面掌握 MySQL 的 INSERT INTO 命令!
