news 2026/6/10 11:47:37

关系型数据库大王Mysql——SQL编程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
关系型数据库大王Mysql——SQL编程

SQL编程

触发器

什么是触发器?

​ 当某个表的数据发生某件事(insert, delete, update), 然后自动触发预先编译好的若干条sql

触发器

1.特点:触发的操作和触发器的sql语句是一个事务操作,具备原子性,要么都执行,要么都不执行

2.作用:保证数据的完整性,起到约束的作用

示例1

mysql> create table emp_count( -> emp_count_id int primary key auto_increment, -> total int); Query OK, 0 rows affected (0.07 sec) mysql> show tables; +--------------------+ | Tables_in_dml_test | +--------------------+ | department | | emp_count | | employee | | user | +--------------------+ 4 rows in set (0.00 sec) mysql> insert into emp_count values(1,0); Query OK, 1 row affected (0.01 sec) mysql> select * from emp_count; +--------------+-------+ | emp_count_id | total | +--------------+-------+ | 1 | 0 | +--------------+-------+ 1 row in set (0.00 sec) mysql> update emp_count set total = 18 where total = 0; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from emp_count; +--------------+-------+ | emp_count_id | total | +--------------+-------+ | 1 | 18 | +--------------+-------+ 1 row in set (0.00 sec) #临时修改终止符,以免与触发器语句发生冲突 mysql> \d $ #delimiter $ mysql> create trigger emp_count_p after insert -> on employee for each row -> begin -> update emp_count set total = total + 1 where emp_count_id = 1; -> end -> $ Query OK, 0 rows affected (0.01 sec) mysql> show triggers\G *************************** 1. row *************************** Trigger: emp_count_p Event: INSERT Table: employee Statement: begin update emp_count set total = total + 1 where emp_count_id = 1; end Timing: AFTER Created: 2025-11-18 20:10:20.59 sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION Definer: root@% character_set_client: utf8mb4 collation_connection: utf8mb4_0900_ai_ci Database Collation: utf8mb4_0900_ai_ci 1 row in set (0.01 sec) mysql> insert into employee(number,name) values("23123213132",'来俊希')$ Query OK, 1 row affected (0.01 sec) mysql> select * from emp_count$ +--------------+-------+ | emp_count_id | total | +--------------+-------+ | 1 | 19 | +--------------+-------+ 1 row in set (0.00 sec)

示例2

mysql> create table bank( -> b_id int primary key auto_increment, -> value int)$ Query OK, 0 rows affected (0.03 sec) mysql> create table u( -> u_id int primary key auto_increment, -> value int)$ Query OK, 0 rows affected (0.04 sec) #创建触发器 mysql> create trigger u_bank_t after insert -> on u for each row -> begin -> update bank set value = value + 500 where b_id = 1; -> end -> $ Query OK, 0 rows affected (0.02 sec) #查看创建的触发器 mysql> show triggers\G *************************** 1. row *************************** Trigger: emp_count_p Event: INSERT Table: employee Statement: begin update emp_count set total = total + 1 where emp_count_id = 1; end Timing: AFTER Created: 2025-11-18 20:10:20.59 sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION Definer: root@% character_set_client: utf8mb4 collation_connection: utf8mb4_0900_ai_ci Database Collation: utf8mb4_0900_ai_ci *************************** 2. row *************************** Trigger: u_bank_t Event: INSERT Table: u Statement: begin update bank set value = value + 500 where b_id = 1; end Timing: AFTER Created: 2025-11-18 20:24:50.28 sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION Definer: root@% character_set_client: utf8mb4 collation_connection: utf8mb4_0900_ai_ci Database Collation: utf8mb4_0900_ai_ci 2 rows in set (0.00 sec) mysql> insert into bank(b_id,value) values(1,0); Query OK, 1 row affected (0.01 sec) mysql> select * from bank; +------+-------+ | b_id | value | +------+-------+ | 1 | 0 | +------+-------+ 1 row in set (0.00 sec) mysql> insert into u(u_id,value) values(1,500); Query OK, 1 row affected (0.01 sec) mysql> select * from bank; +------+-------+ | b_id | value | +------+-------+ | 1 | 500 | +------+-------+ 1 row in set (0.00 sec) mysql> select * from u; +------+-------+ | u_id | value | +------+-------+ | 1 | 500 | +------+-------+ 1 row in set (0.00 sec) mysql> select value from u where u_id = 1; +-------+ | value | +-------+ | 500 | +-------+ 1 row in set (0.00 sec) mysql> select value from u group by u_id having max(value); +-------+ | value | +-------+ | 500 | +-------+ 1 row in set (0.00 sec) mysql> insert into bank(value) select value from u group by u_id having max(value); Query OK, 1 row affected (0.02 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> select * from bank; +------+-------+ | b_id | value | +------+-------+ | 1 | 500 | | 2 | 500 | +------+-------+ 2 rows in set (0.00 sec)

存储过程

什么是存储过程

事先经过编译并存储在数据库中的一段sql语句集合

示例1

mysql> create procedure emp_count() -> begin -> select count(emp_count_id) from emp_count; -> end -> $ Query OK, 0 rows affected (0.01 sec) #查看创建的存储过程 mysql> show create procedure emp_count\G$ *************************** 1. row *************************** Procedure: emp_count sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION Create Procedure: CREATE DEFINER=`root`@`%` PROCEDURE `emp_count`() begin select count(emp_count_id) from emp_count; end character_set_client: utf8mb4 collation_connection: utf8mb4_0900_ai_ci Database Collation: utf8mb4_0900_ai_ci 1 row in set (0.00 sec) #调用存储过程 mysql> call emp_count(); -> $ +---------------------+ | count(emp_count_id) | +---------------------+ | 1 | +---------------------+ 1 row in set (0.00 sec)

示例2

mysql> create table t1( -> id int primary key auto_increment, -> password varchar(255)); -> $ Query OK, 0 rows affected (0.03 sec) mysql> create procedure insert_many_date(in total_row) -> begin -> declare i int default 1; -> while (i < rows) do -> insert into t1 values(i,md5(i)); -> set i = i + 1; -> end while; -> end -> $ mysql> create procedure user_password(in pwd varchar(255)) -> begin -> select * from user where password = pwd; -> end$ Query OK, 0 rows affected (0.01 sec) mysql> call user_password("111")$ Empty set (0.01 sec)

示例3

mysql> select * from user; -> $ +---------+----------+----------+------+------------+ | user_id | username | password | name | hire_date | +---------+----------+----------+------+------------+ | 1 | ljx | ljxbbfjw | cj | 2006-06-06 | | 2 | ljx | ljxbbfjw | cj | 2006-06-06 | | 3 | lisi | 123 | ls | 2007-07-07 | | 4 | wangwu | 123 | ww | 2008-08-08 | | 5 | cj | 123 | cj | 2009-09-09 | +---------+----------+----------+------+------------+ 5 rows in set (0.00 sec) mysql> create procedure user_password(in pwd varchar(255)) -> begin -> select * from user where password = pwd; -> end$ Query OK, 0 rows affected (0.01 sec) mysql> call user_password("123")$ +---------+----------+----------+------+------------+ | user_id | username | password | name | hire_date | +---------+----------+----------+------+------------+ | 3 | lisi | 123 | ls | 2007-07-07 | | 4 | wangwu | 123 | ww | 2008-08-08 | | 5 | cj | 123 | cj | 2009-09-09 | +---------+----------+----------+------+------------+ 3 rows in set (0.00 sec) Query OK, 0 rows affected (0.00 sec)

示例4

mysql> select @a; -> $ +------------+ | @a | +------------+ | NULL | +------------+ 1 row in set (0.00 sec) mysql> set @a = 1; -> $ Query OK, 0 rows affected (0.01 sec) mysql> select @a; -> $ +------+ | @a | +------+ | 1 | +------+ 1 row in set (0.00 sec) mysql> \d $ mysql> create procedure user_count_a(out number int) -> begin -> select count(1) into number from user; -> end$ Query OK, 0 rows affected (0.01 sec) mysql> show create procedure user_count_a\G$ *************************** 1. row *************************** Procedure: user_count_a sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION Create Procedure: CREATE DEFINER=`root`@`%` PROCEDURE `user_count_a`(out number int) begin select count(1) into number from user; end character_set_client: utf8mb4 collation_connection: utf8mb4_0900_ai_ci Database Collation: utf8mb4_0900_ai_ci 1 row in set (0.00 sec) mysql> call user_count_a(@a); -> $ Query OK, 1 row affected (0.01 sec) mysql> select @a -> $ +------+ | @a | +------+ | 5 | +------+ 1 row in set (0.00 sec) mysql> \d ; mysql> select count(1) from user; +----------+ | count(1) | +----------+ | 5 | +----------+ 1 row in set (0.00 sec)

示例5

mysql> \d $ mysql> create procedure count_emp_name(in dep_name varchar(255),out count_emp int) -> begin -> select count(*) into count_emp from employee where department_NO = (select number from department where name = dep_name); -> end$ Query OK, 0 rows affected (0.02 sec) mysql> \d ; mysql> show create procedure count_emp_name\G; *************************** 1. row *************************** Procedure: count_emp_name sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION Create Procedure: CREATE DEFINER=`root`@`%` PROCEDURE `count_emp_name`(in dep_name varchar(255),out count_emp int) begin select count(*) into count_emp from employee where department_NO = (select number from department where name = dep_name); end character_set_client: utf8mb4 collation_connection: utf8mb4_0900_ai_ci Database Collation: utf8mb4_0900_ai_ci 1 row in set (0.00 sec) mysql> call count_emp_name("上海中心",@a); Query OK, 1 row affected (0.00 sec) mysql> select @a -> ; +------+ | @a | +------+ | 2 | +------+ 1 row in set (0.00 sec) mysql> select count(*) from employee where department_NO = (select number from department where name = "上海中心"); +----------+ | count(*) | +----------+ | 2 | +----------+ 1 row in set (0.00 sec)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 14:54:25

ssm宠物医院挂号系统r0f38(程序+源码+数据库+调试部署+开发环境)

本系统&#xff08;程序源码数据库调试部署开发环境&#xff09;带论文文档1万字以上&#xff0c;文末可获取&#xff0c;系统界面在最后面。 系统程序文件列表 开题报告内容 一、研究背景与意义 随着宠物数量的增加&#xff0c;宠物健康问题日益受到重视&#xff0c;宠物医…

作者头像 李华
网站建设 2026/6/10 4:27:03

ssm超市管理系统1q934--(程序+源码+数据库+调试部署+开发环境)

本系统&#xff08;程序源码数据库调试部署开发环境&#xff09;带论文文档1万字以上&#xff0c;文末可获取&#xff0c;系统界面在最后面。 系统程序文件列表 开题报告内容 题目&#xff1a;超市管理系统的设计与实现 一、研究背景 随着零售业的快速发展&#xff0c;超市…

作者头像 李华
网站建设 2026/6/10 5:46:34

Agent 经典范式构建之 ReAct (Reasoning and Acting): 一种将“思考”和“行动”紧密结合的范式,让智能体边想边做,动态调整

Agent 经典范式构建之 ReAct (Reasoning and Acting)&#xff1a; 一种将“思考”和“行动”紧密结合的范式&#xff0c;让智能体边想边做&#xff0c;动态调整 [TOC](Agent 经典范式构建之 ReAct (Reasoning and Acting)&#xff1a; 一种将“思考”和“行动”紧密结合的范式…

作者头像 李华
网站建设 2026/6/10 0:34:01

W5500以太网模块原理图中磁珠使用的注意事项

以下是对您提供的技术博文进行 深度润色与结构优化后的版本 。整体目标是: ✅ 彻底去除AI生成痕迹 (避免模板化表达、空洞术语堆砌、机械式罗列) ✅ 强化工程师视角的真实感与实战性 (融入设计取舍、调试经验、手册潜台词解读) ✅ 逻辑更自然流畅,由问题驱动而…

作者头像 李华
网站建设 2026/6/10 15:07:26

Local AI MusicGen完整指南:高效生成WAV音频文件

Local AI MusicGen完整指南&#xff1a;高效生成WAV音频文件 1. 你的私人AI作曲家&#xff1a;零基础玩转本地音乐生成 &#x1f3b5; Local AI MusicGen 这不是一个需要注册、订阅或联网等待的在线服务&#xff0c;而是一个真正属于你自己的本地音乐生成工作台。它基于 Meta…

作者头像 李华