mysql菜鸟教程

首页 >> mysql菜鸟教程

5.1 添加数据:INSERT语句详解

通过前面的学习,你已经搭建好了数据库的“仓库”(CREATE DATABASE)和设计好了“货架”结构(CREATE TABLE)。现在,是时候向货架上“摆放货物”了——即为数据表添加真实的记录。INSERT 语句就是完成这项工作的核心工具,它是所有数据操作的起点。

理解 INSERT 语句的基本结构至关重要,下图清晰地展示了其核心语法构成与不同用法:

一、INSERT 核心语法与基础用法

1、最基本的语法

INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
  • INSERT INTO table_name:指定要向哪张表插入数据。

  • (column1, column2, ...)列清单。明确指出要为哪些列提供数据。这是推荐做法,因为它清晰、灵活,即使表结构以后发生变化(如增加新列),语句也可能无需修改。

  • VALUES (value1, value2, ...)值清单。提供与列清单一一对应、顺序一致的数据值。字符串和日期类型通常需要用单引号‘’)括起来。

示例:向“学生表”插入第一条记录

假设我们有一张 students 表,结构如下:


CREATE TABLE students (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    age TINYINT UNSIGNED,
    email VARCHAR(100)
);

安全、明确的插入方式

-- 明确指定列名进行插入(推荐)
INSERT INTO students (name, age, email)
VALUES (‘张三’, 20, ‘zhangsan@example.com’);

执行结果:数据库会自动为 id 生成一个唯一递增的数字(如1),其他列填入我们指定的值。

另一种方式(省略列清单,不推荐)

-- 为表中所有列提供值,且顺序必须与表定义完全一致
INSERT INTO students
VALUES (NULL, ‘李四’, 22, ‘lisi@example.com’);
-- id用NULL或0,让AUTO_INCREMENT自动生成

这种方式虽然简洁,但非常脆弱。一旦表结构改变(如增删列、调整顺序),此语句就会出错或插入错误数据。

2、高效插入多条数据

INSERT 语句可以一次性插入多行数据,这比逐行插入效率高得多。

语法

INSERT INTO table_name (column1, column2, ...)
VALUES 
    (value1_row1, value2_row1, ...),
    (value1_row2, value2_row2, ...),
    ...;

示例:批量添加学生信息

INSERT INTO students (name, age, email)
VALUES 
    (‘王五’, 21, ‘wangwu@example.com’),
    (‘赵六’, 19, ‘zhaoliu@example.com’),
    (‘钱七’, 20, NULL); -- email允许为NULL,所以可以插入NULL值

一次执行,三条记录就同时插入了。

3、插入查询的结果:复制或迁移数据

INSERT 还可以与 SELECT 语句结合,将一个查询的结果直接插入到另一张表中。这在数据备份、表复制或数据迁移时非常有用。

语法

INSERT INTO target_table (column1, column2, ...)
SELECT column1, column2, ...
FROM source_table
[WHERE condition];

示例场景

a、创建“毕业生”档案表

-- 1. 先创建一张结构相同的归档表
CREATE TABLE graduates LIKE students;

-- 2. 将年龄大于22岁的学生数据插入到毕业生表
INSERT INTO graduates (name, age, email)
SELECT name, age, email 
FROM students 
WHERE age > 22;

b、简化表复制(创建表并同时插入数据):

-- 创建students表的一个完整副本(包括数据)
CREATE TABLE students_backup AS
SELECT * FROM students;

二、常见错误与特殊值处理

初学者在使用 INSERT 时,经常会遇到以下问题:

错误场景

示例(错误写法)

原因与解决方案

列与值数量不匹配

INSERT INTO students (name, age) VALUES (‘张三’);

列清单有2列,值清单只有1个值。

必须数量一致

字符串未加引号

INSERT INTO students (name) VALUES (张三);

字符串 

张三

 必须用单引号包裹:

‘张三’

。数字不用。

插入重复的主键

INSERT INTO students (id, name) VALUES (1, ‘张三’);

如果id=1已存在,会违反主键唯一约束。

对于自增主键,通常不应在INSERT中指定其值

违反非空约束

INSERT INTO students (name, age) VALUES (NULL, 20);

name

 列定义为 

NOT NULL

,不能插入 

NULL

。必须提供一个有效值。

插入超长数据

INSERT INTO students (name) VALUES (‘一个非常非常长…的名字’);

超出 

VARCHAR(100)

 的长度限制。会被截断或报错(取决于SQL模式)。

三、特殊值插入

-- 插入NULL值(如果列允许为NULL)
INSERT INTO students (name, age, email) VALUES (‘孙八’, 21, NULL);

-- 插入默认值(使用DEFAULT关键字,或直接省略该列)
INSERT INTO students (name, age, email) VALUES (‘周九’, DEFAULT, ‘zhoujiu@example.com’);
-- 假设age列有默认值18,以上语句会使用18

-- 插入当前时间(对于TIMESTAMP/DATETIME列)
INSERT INTO logs (operation, created_at) VALUES (‘用户登录’, NOW());

四、INSERT 最佳实践与高级技巧

  1. 总是指定列清单:使代码更清晰、更健壮,易于维护。

  2. 处理大量数据时:使用多行插入语句或 LOAD DATA INFILE 命令(从文件导入),比单条插入快几个数量级。

  3. 获取自增ID:插入后,如果需要立即获取数据库生成的自增ID(例如,用于插入关联表),在客户端编程中可以使用类似 LAST_INSERT_ID() 的函数。

  4. INSERT IGNORE 与 INSERT … ON DUPLICATE KEY UPDATE

    • INSERT IGNORE:如果插入会导致重复键等错误,则忽略此条插入,但不会报错。

INSERT IGNORE INTO students (id, name) VALUES (1, ‘张三’);
    • INSERT … ON DUPLICATE KEY UPDATE:如果发生重复键冲突,则执行更新操作。这是“插入或更新”的经典实现。

-- 如果id=1存在,则更新name和age;否则插入新记录
INSERT INTO students (id, name, age) 
VALUES (1, ‘张三’, 20)
ON DUPLICATE KEY UPDATE name = VALUES(name), age = VALUES(age);

综合实战练习

假设你需要为一个简单的任务管理系统初始化数据。

-- 1. 创建任务表
CREATE TABLE tasks (
    id INT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(200) NOT NULL,
    description TEXT,
    is_completed BOOLEAN DEFAULT FALSE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 2. 插入初始任务(混合各种值)
INSERT INTO tasks (title, description, is_completed)
VALUES
    (‘学习MySQL INSERT语句’, ‘完成教程第5.1节的学习’, TRUE),
    (‘购买 groceries’, ‘牛奶、鸡蛋、面包’, DEFAULT), -- is_completed将使用默认值FALSE
    (‘规划周末旅行’, NULL, FALSE); -- description为NULL

-- 3. 验证插入
SELECT * FROM tasks;

INSERT 语句是你将业务数据注入数据库生命线的首要方式。掌握它的各种形式,你就拥有了向数据库世界填充内容的基本能力。


发表评论

昵称:
联系方式:
评论内容:

所有评论

关于我 备案号:蜀ICP备2023042032号-1