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 最佳实践与高级技巧
-
总是指定列清单:使代码更清晰、更健壮,易于维护。
-
处理大量数据时:使用多行插入语句或 LOAD DATA INFILE 命令(从文件导入),比单条插入快几个数量级。
-
获取自增ID:插入后,如果需要立即获取数据库生成的自增ID(例如,用于插入关联表),在客户端编程中可以使用类似 LAST_INSERT_ID() 的函数。
-
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 语句是你将业务数据注入数据库生命线的首要方式。掌握它的各种形式,你就拥有了向数据库世界填充内容的基本能力。

发表评论
所有评论