MySQL(三) - 表中数据增删改操作
文章目录
- 一、添加数据
- 1. 添加数据语法及解释
- 2. 示例
- 2.1 添加单条数据
- 2.2 添加多条数据
- 二、更新数据
- 1. 更新数据语法及解释
- 2. 示例
- 2.1 更新一条数据
- 2.2 更新多条数据
- 三、删除数据
- 1. 删除数据语法及解释
- 2. 示例
- 2.1 删除一条数据
- 2.2 删除多条数据
- 2.3 清空表数据
一、添加数据
在成功创建数据表并定义好结构后,下一步就是向表中插入实际的数据。在MySQL中,使用 INSERT INTO
语句来完成数据的添加操作。掌握正确的插入语法,是进行数据库数据填充的基础。
1. 添加数据语法及解释
INSERT INTO
语句用于向指定的数据表中插入一条或多条新记录。其核心语法灵活,支持多种写法。
基本语法:
INSERT INTO table_name [(column1, column2, ...)]
VALUES (value1, value2, ...), (value1, value2, ...), ...;
语法元素详解:
语法元素 | 说明 |
---|---|
INSERT INTO | SQL关键字,表示要执行插入操作。 |
table_name | 目标数据表的名称。 |
(column1, column2, ...) | 可选。指定要插入数据的列名列表。如果省略此部分,则必须为表中的所有列按定义顺序提供值。 |
VALUES | 关键字,后跟要插入的具体值。 |
(value1, value2, ...) | 一组要插入的值,用括号包围,值之间用逗号分隔。每组值对应一行记录。 |
多行插入 | 可以在 VALUES 后跟多组 (value1, value2, ...) ,每组之间用逗号分隔,实现一次性插入多条记录。 |
关键规则与注意事项:
- 值的顺序:如果指定了列名列表
(column1, column2, ...)
,那么VALUES
中的值必须与列名列表的顺序一一对应。 - 值的数量:
VALUES
中每一组值的数量必须与指定的列数(或表的总列数,如果未指定列名)完全匹配。 - 数据类型匹配:插入的值必须与对应列的数据类型兼容。例如,不能向
INT
列插入字符串(除非是数字字符串)。 - NULL值处理:
- 对于允许
NULL
的列,可以用NULL
字面量表示空值。 - 对于有
DEFAULT
约束的列,可以省略该列,或使用DEFAULT
关键字,系统将自动填充默认值。
- 对于允许
- 自增列(AUTO_INCREMENT):
- 对于设置了
AUTO_INCREMENT
的主键列(如student_id
),在插入时可以:- 显式指定为
NULL
或0
,MySQL会自动分配下一个自增值。 - 或者,直接省略该列(前提是列名列表中不包含它)。
- 显式指定为
- 对于设置了
- 唯一约束与主键:插入的值不能违反表的
PRIMARY KEY
或UNIQUE
约束,否则会报错(如Duplicate entry
)。 - 字符集与引号:字符串值必须用单引号
' '
或双引号" "
包围。日期时间值也需用引号包围。
2. 示例
2.1 添加单条数据
把修改后的学生姓名
字段改为建表时的字段。
ALTER TABLE student CHANGE s_name student_name VARCHAR(50) NOT NULL COMMENT '学生姓名';
向 student
表中插入多个单条学生记录。
INSERT INTO student (student_no, student_name, gender, birth_date, major, enroll_date)
VALUES ('2024001', '张三', '男', '2002-03-15', '计算机科学与技术', '2024-09-01');INSERT INTO student (student_no, student_name, gender, major, enroll_date)
VALUES ('2024002', '李四', '女', '软件工程', '2024-09-01');INSERT INTO student (student_no, student_name, gender, birth_date, major, enroll_date)
VALUES ('2024003', '王五', '男', NULL, '数据科学', '2024-09-01');
说明:
- 省略了
student_id
(自增主键)和create_time
(有默认值)。student_id
将自动从1001开始递增。create_time
将自动填充为当前时间。birth_date
列允许NULL
,可显式插入NULL
表示出生日期未知。
2.2 添加多条数据
使用 INSERT INTO ... VALUES
一次性插入多条记录,向 course
表中一次性添加多条课程数据。
INSERT INTO course (course_no, course_name, credit, teacher_name, course_hours)
VALUES
('CS101', 'Python程序设计', 3, '张教授', 48),
('CS102', '数据库原理', 4, '李教授', 64),
('CS103', '数据结构', 4, '王教授', 64),
('MATH101', '高等数学', 5, '赵教授', 80),
('ENGL101', '大学英语', 2, '刘教授', 32);
向 student_course
表中一次性添加多条选课数据:
INSERT INTO student_course (student_id, course_id, score, is_valid)
VALUES
(1001, 101, NULL, 1), -- 张三选了Python,成绩未出
(1001, 102, 85.5, 1), -- 张三选了数据库,成绩85.5
(1002, 101, 92.0, 1), -- 李四选了Python,成绩92.0
(1002, 103, NULL, 1), -- 李四选了数据结构,成绩未出
(1003, 102, 78.0, 1), -- 王五选了数据库,成绩78.0
(1003, 104, 95.0, 1); -- 王五选了高数,成绩95.0
说明:
score
为NULL
表示尚未考试或成绩未录入。is_valid = 1
表示选课有效。- 由于外键约束的存在,
student_id
和course_id
必须是student
和course
表中已存在的ID,否则会报错Cannot add or update a child row: a foreign key constraint fails
。
插入数据的最佳实践:
- 明确指定列名:即使插入所有列,也建议写出列名列表,提高SQL的可读性和可维护性,避免因表结构变更导致错误。
- 使用事务:对于关联性较强的操作(如先插学生,再插选课),建议使用事务(
START TRANSACTION
,COMMIT
,ROLLBACK
)来保证数据的一致性。 - 批量插入:当需要插入大量数据时,尽量使用单条
INSERT
语句插入多行,而不是循环执行多条单行插入,以显著提升性能。 - 数据验证:在应用层或通过数据库约束(如
CHECK
,FOREIGN KEY
)确保插入数据的合法性和完整性。
二、更新数据
在数据库应用中,数据并非一成不变。当需要修改已存在记录的某些字段值时,可以使用 UPDATE
语句。UPDATE
是数据操作语言(DML)中的核心命令之一,能够高效地对表中的数据进行修改。
1. 更新数据语法及解释
UPDATE
语句用于修改表中满足特定条件的一行或多行数据。
基本语法:
UPDATE table_name
SET column1 = value1, column2 = value2, ...
[WHERE condition]
[ORDER BY ...]
[LIMIT row_count];
语法元素详解:
语法元素 | 说明 |
---|---|
UPDATE table_name | 指定要更新数据的目标表。 |
SET | 关键字,后跟要修改的列及其新值。可以同时更新多个列,列与列之间用逗号分隔。 |
column = value | 指定要更新的列名和赋予的新值。值可以是常量、表达式或 NULL 。 |
WHERE condition | 极其重要!用于指定更新哪些行。只有满足 WHERE 子句中条件的记录才会被更新。如果省略 WHERE 子句,表中的所有行都会被更新! |
ORDER BY ... | 可选。当更新受 LIMIT 限制时,指定按什么顺序更新行。 |
LIMIT row_count | 可选。限制被更新的行数。常用于只更新前N条记录。 |
关键规则与注意事项:
WHERE
子句至关重要:WHERE
是防止“误伤”其他数据的保险。在执行UPDATE
前,务必确认WHERE
条件能精确定位到需要更新的记录。一个没有WHERE
的UPDATE
可能会带来灾难性后果。- 数据类型匹配:赋给列的新值必须与列的数据类型兼容。
- 约束检查:更新后的值不能违反表的约束,如
PRIMARY KEY
、UNIQUE
、FOREIGN KEY
、CHECK
等。例如,不能将student_no
更新为一个已存在的学号。 NULL
值处理:可以用SET column = NULL
将列的值设为NULL
,前提是该列允许NULL
。- 表达式更新:
SET
子句中可以使用表达式。例如,SET score = score + 5
表示给成绩加5分。 - 外键影响:如果更新的是被外键引用的主键列(如
student_id
),由于您在student_course
表中设置了ON UPDATE CASCADE
,关联的子表记录会自动同步更新。 - 事务安全:对于关键数据的更新,建议在事务中执行,以便在出现问题时可以回滚(
ROLLBACK
)。
2. 示例
以下示例基于已插入数据的 student
和 student_course
表进行演示。
2.1 更新一条数据
更新 student
表中特定学生的信息。
-- 更新学生的出生日期
UPDATE student SET birth_date = '2002-03-16' WHERE student_no = '2024001';-- 更新学生的专业
UPDATE student SET major = '人工智能' WHERE student_name = '王五' AND gender = '男';
2.2 更新多条数据
使用 UPDATE
语句一次性修改多条满足条件的记录。
-- 批量更新选课成绩
UPDATE student_course
SET score = score + 3, is_valid = 1
WHERE course_id = 101 AND score IS NOT NULL;-- 使用 `LIMIT` 限制更新数量
UPDATE student
SET major = '大数据技术'
WHERE student_no = 2024003
LIMIT 1;
更新数据的最佳实践:
- Always Use
WHERE
:养成习惯,写UPDATE
语句时先写WHERE
子句,并仔细检查条件。 - 先
SELECT
再UPDATE
:在执行UPDATE
前,先用SELECT * FROM table WHERE condition
查看将要被更新的记录,确认无误后再执行更新。 - 使用事务:对于复杂的更新或涉及多表的操作,使用事务来保证原子性。
- 备份关键数据:在对生产环境的关键数据进行大规模更新前,务必备份相关表或记录。
- 利用外键级联:合理利用
ON UPDATE CASCADE
可以简化主键更新后的维护工作,但要理解其影响。
三、删除数据
在数据库管理中,除了添加和修改数据,有时也需要移除不再需要的记录。MySQL 提供了 DELETE
语句用于从表中删除行。与 DROP TABLE
(删除整个表)不同,DELETE
只删除表中的数据,而保留表的结构。正确使用 DELETE
语句对于维护数据的准确性和数据库的整洁至关重要。
1. 删除数据语法及解释
DELETE
语句用于删除表中满足特定条件的一行或多行数据。
删除数据基本语法:
DELETE FROM table_name
[WHERE condition]
[ORDER BY ...]
[LIMIT row_count];
清空表基本语法:
TRUNCATE [TABLE] table_name;
语法元素详解:
语法元素 | 说明 |
---|---|
DELETE FROM | SQL关键字,表示要执行删除操作。 |
table_name | 指定要从中删除数据的目标表。 |
WHERE condition | 极其关键!用于指定删除哪些行。只有满足 WHERE 子句中条件的记录才会被删除。如果省略 WHERE 子句,表中的所有行都会被删除!(表结构保留) |
ORDER BY ... | 可选。当删除受 LIMIT 限制时,指定按什么顺序删除行。 |
LIMIT row_count | 可选。限制被删除的行数。常用于只删除前N条记录。 |
关键规则与注意事项:
WHERE
子句是生命线:WHERE
条件是防止误删数据的最重要保障。永远不要在生产环境中执行没有WHERE
子句的DELETE
语句,除非您的目的就是清空整个表(此时应使用更高效的TRUNCATE TABLE
)。- 外键约束的影响:
- 如果要删除的记录是其他表的“父记录”(即被外键引用),则删除操作会受到外键约束的限制。
- 在您的设计中,
student
和course
表是student_course
表的父表,且设置了ON DELETE CASCADE
。 - 这意味着:当您删除
student
表中的一个学生时,student_course
表中所有关联该学生的选课记录将自动被级联删除。这保证了数据的一致性。
DELETE
与TRUNCATE
的区别:DELETE
可以带WHERE
条件,逐行删除,可以回滚(在事务中),会触发DELETE
触发器,但速度较慢。TRUNCATE TABLE
会快速清空整个表,重置自增计数器,不能带WHERE
,通常不能回滚,不触发触发器,效率极高。
- 事务安全:对于关键数据的删除,强烈建议在事务中执行。如果删除后发现问题,可以使用
ROLLBACK
回滚事务,恢复数据。 - 自增ID(AUTO_INCREMENT):
DELETE
删除行后,自增ID不会回退。即使删除了ID为1005的记录,下一个插入的记录ID仍会是1006。
2. 示例
以下示例基于已填充数据的 student
、course
和 student_course
表进行演示。
2.1 删除一条数据
删除 student
表中特定的一条学生记录。
DELETE FROM student WHERE student_no = '2024003';
2.2 删除多条数据
删除 course
表中满足特定条件的多条记录。
DELETE FROM course WHERE course_id= 101;DELETE FROM course;
2.3 清空表数据
TRUNCATE TABLE student_course;
TRUNCATE
不能用于清空设置了外键对应的表。
删除数据的最佳实践:
- 三思而后行:删除操作是不可逆的(除非有备份或在事务中),执行前务必确认。
- 先
SELECT
再DELETE
:在执行DELETE
之前,先用SELECT * FROM table_name WHERE condition
查看将要被删除的记录,确保条件正确无误。 - 善用事务:在执行删除操作前,使用
START TRANSACTION;
开启事务。删除后检查结果,如果正确则COMMIT;
,如果错误则ROLLBACK;
。 - 备份为王:对于生产环境的关键表,执行删除操作前,务必备份相关数据。
- 理解外键级联:清楚了解表之间的外键关系和级联行为(
CASCADE
,SET NULL
,RESTRICT
),避免意外删除大量关联数据或因约束而失败。