菜鸟科技网

MySQL insert into命令如何正确使用?

INSERT INTO 命令简介

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

MySQL insert into命令如何正确使用?-图1
(图片来源网络,侵删)

基本语法:插入完整的行

这是最简单的用法,你需要按照表结构中列的顺序,提供所有列的值。

语法

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:明确指定列名

这是推荐的做法,因为它更具可读性,并且在表结构发生变化时(比如增加新列)不容易出错。

MySQL insert into命令如何正确使用?-图2
(图片来源网络,侵删)
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 的,所以我们通常插入 NULLDEFAULT,让数据库自动生成一个唯一的 ID,直接省略 id 列并只提供其他列的值是更常见的做法,但语法上需要明确列出要插入的列。


插入部分列

如果你的表有很多列,但你只想为其中一部分列插入数据,其他列有 DEFAULT 值或允许 NULL,这是完全可行的。

MySQL insert into命令如何正确使用?-图3
(图片来源网络,侵删)

示例

我们只为 nameenrollment_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';

重要注意事项和最佳实践

  1. 数据类型匹配

    • 插入的值必须与列定义的数据类型兼容,你不能将字符串 'abc' 插入到 INT 类型的列中。
    • 日期和时间值应该使用正确的格式,如 'YYYY-MM-DD''YYYY-MM-DD HH:MM:SS'
  2. 字符串和日期值需要用单引号

    • 在 SQL 中,字符串、日期和时间类型的值必须用单引号 () 括起来,数字类型的值则不需要。
    • 错误示例: INSERT INTO students (name) VALUES (张三);
    • 正确示例: INSERT INTO students (name) VALUES ('张三');
  3. 处理 AUTO_INCREMENT

    • 对于自增列,通常不要手动指定值,在插入时,可以插入 NULLDEFAULT 或者直接省略该列,让数据库自动处理。
  4. 处理 NULL

    • 如果某列允许为 NULL,你可以直接在 VALUES 子句中写入 NULL
    • 如果某列有 NOT NULL 约束,则必须为其提供一个值,否则插入会失败。
  5. 使用 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。
  6. 使用 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 命令!

分享:
扫描分享到社交APP
上一篇
下一篇