当前位置: 首页 > news >正文

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 INTOSQL关键字,表示要执行插入操作。
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),在插入时可以:
      • 显式指定为 NULL0,MySQL会自动分配下一个自增值。
      • 或者,直接省略该列(前提是列名列表中不包含它)。
  • 唯一约束与主键:插入的值不能违反表的 PRIMARY KEYUNIQUE 约束,否则会报错(如 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

说明

  • scoreNULL 表示尚未考试或成绩未录入。
  • is_valid = 1 表示选课有效。
  • 由于外键约束的存在,student_idcourse_id 必须是 studentcourse 表中已存在的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 条件能精确定位到需要更新的记录。一个没有 WHEREUPDATE 可能会带来灾难性后果。
  • 数据类型匹配:赋给列的新值必须与列的数据类型兼容。
  • 约束检查:更新后的值不能违反表的约束,如 PRIMARY KEYUNIQUEFOREIGN KEYCHECK 等。例如,不能将 student_no 更新为一个已存在的学号。
  • NULL 值处理:可以用 SET column = NULL 将列的值设为 NULL,前提是该列允许 NULL
  • 表达式更新SET 子句中可以使用表达式。例如,SET score = score + 5 表示给成绩加5分。
  • 外键影响:如果更新的是被外键引用的主键列(如 student_id),由于您在 student_course 表中设置了 ON UPDATE CASCADE,关联的子表记录会自动同步更新。
  • 事务安全:对于关键数据的更新,建议在事务中执行,以便在出现问题时可以回滚(ROLLBACK)。

2. 示例

以下示例基于已插入数据的 studentstudent_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 子句,并仔细检查条件。
  • SELECTUPDATE:在执行 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 FROMSQL关键字,表示要执行删除操作。
table_name指定要从中删除数据的目标表。
WHERE condition极其关键!用于指定删除哪些行。只有满足 WHERE 子句中条件的记录才会被删除。如果省略 WHERE 子句,表中的所有行都会被删除!(表结构保留)
ORDER BY ...可选。当删除受 LIMIT 限制时,指定按什么顺序删除行。
LIMIT row_count可选。限制被删除的行数。常用于只删除前N条记录。

关键规则与注意事项:

  • WHERE 子句是生命线WHERE 条件是防止误删数据的最重要保障。永远不要在生产环境中执行没有 WHERE 子句的 DELETE 语句,除非您的目的就是清空整个表(此时应使用更高效的 TRUNCATE TABLE)。
  • 外键约束的影响
    • 如果要删除的记录是其他表的“父记录”(即被外键引用),则删除操作会受到外键约束的限制。
    • 在您的设计中,studentcourse 表是 student_course 表的父表,且设置了 ON DELETE CASCADE
    • 这意味着:当您删除 student 表中的一个学生时,student_course 表中所有关联该学生的选课记录将自动被级联删除。这保证了数据的一致性。
  • DELETETRUNCATE 的区别
    • DELETE 可以带 WHERE 条件,逐行删除,可以回滚(在事务中),会触发 DELETE 触发器,但速度较慢。
    • TRUNCATE TABLE 会快速清空整个表,重置自增计数器,不能带 WHERE,通常不能回滚,不触发触发器,效率极高。
  • 事务安全:对于关键数据的删除,强烈建议在事务中执行。如果删除后发现问题,可以使用 ROLLBACK 回滚事务,恢复数据。
  • 自增ID(AUTO_INCREMENT)DELETE 删除行后,自增ID不会回退。即使删除了ID为1005的记录,下一个插入的记录ID仍会是1006。

2. 示例

以下示例基于已填充数据的 studentcoursestudent_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 不能用于清空设置了外键对应的表。

删除数据的最佳实践:

  • 三思而后行:删除操作是不可逆的(除非有备份或在事务中),执行前务必确认。
  • SELECTDELETE:在执行 DELETE 之前,先用 SELECT * FROM table_name WHERE condition 查看将要被删除的记录,确保条件正确无误。
  • 善用事务:在执行删除操作前,使用 START TRANSACTION; 开启事务。删除后检查结果,如果正确则 COMMIT;,如果错误则 ROLLBACK;
  • 备份为王:对于生产环境的关键表,执行删除操作前,务必备份相关数据。
  • 理解外键级联:清楚了解表之间的外键关系和级联行为(CASCADE, SET NULL, RESTRICT),避免意外删除大量关联数据或因约束而失败。
http://www.dtcms.com/a/473562.html

相关文章:

  • [嵌入式系统-101]:AIoT(人工智能物联网)开发板
  • 成都装修网站制作免费一键网站
  • 2025版spring security认证授权详解篇【经典】
  • 第五十五章 ESP32S3 基于MQTT协议连接OneNet物联网开放平台
  • MySQL可重复读的级别下,幻读本质问题
  • MaixCam二维云台检测人脸项目
  • 无线收发系统结构
  • 做网站的工作是什么开发公司官网
  • Node.js 与 MongoDB:高效的数据管理解决方案
  • 网络层:从 IP 协议到路由转发
  • 做网站办什么营业执照nginx wordpress 伪静态
  • 深入理解TCP/IP通信:系统调用与零拷贝技术全面解析
  • 编程语言Delphi
  • 【AI论文】RLP:将强化学习作为预训练目标
  • Etcd使用
  • etcd实战课-实战篇(上)
  • Kubernetes 运维指南:kubectl 命令全解析
  • 网站logo关键字参数
  • ubuntu下桌面应用启动图标的内容文件
  • Leetcode 25
  • 西安博达网站建设自己制作wordpress plugin
  • OpenCV的数据类型二
  • Serdes专题(3)Lattice Serdes架构
  • 人形机器人项目中使用Ubuntu-Server安装桌面系统进行远程xrdp远程连接操作
  • 京东开源了一款大模型安全框架:JoySafety,说是京东内部已应用,实现95%+攻击拦截率
  • 【传奇开心果系列】基于Flet框架实现的关于页面创建和提供文件下载集成了网络请求、文件下载、剪贴板操作功能自定义模板特色和实现原理深度解析
  • ​为什么我们需要将Flow转换为StateFlow?​​
  • vscode远程连接云服务器的初次尝试
  • 甘肃网站开发公司用手机怎么做免费网站
  • 网站是由多个网页组成的吗济南网约车平台