Loading

mysql【存储过程】【触发器】

触发器学习链接:https://www.runoob.com/w3cnote/mysql-stored-procedure.html

示例

show databases;

-- 创建表test2
create table test2 (
	s_id INT primary key,
	s_name VARCHAR(32),
	s_age INT
);

-- 插入
insert into test2 (s_name,s_age) values ('周英杰',20); -- 没有设置自增或者默认值的话会报错
insert into test2 (s_name,s_age) values 
('孟子恒',20),
('张艺卓',20),
('段青垚',21);
insert into test2 (s_name,s_age) values ('马俊杰',21),('张馨元',20); 

-- 给s_id添加自增
alter table test2 modify s_id INT AUTO_INCREMENT;  -- primary key保留着
-- alter table test2 add constraint auto_increment_s_id auto_increment (s_id);  语法不对

-- 查看表结构
DESCRIBE test2;

存储过程

-- 定义存储过程
-- BEGIN .... END:存储过程开始和结束符号:
delimiter $$  -- 作用:这是改变命令结束符;为$$
create procedure ShowTest2Students()
begin
	SELECT * from test2;  -- 需要加;
end$$
delimiter ; -- 恢复默认分隔符

-- 展示已有的存储过程
SHOW PROCEDURE STATUS;

-- 删除存储过程
DROP PROCEDURE IF EXISTS ShowTest2Students;

-- 调用存储过程
call ShowTest2Students();

触发器

-- 定义触发器
-- 触发器通常用于更新或插入数据,不支持执行 SELECT 或其他查询操作来返回结果给客户端
create trigger after_test2_delete
after delete on test2
for each row
begin
	insert into student (s_name,s_age) values ('匿名用户',100);  -- 正确
	-- 	UPDATE test2 set s_age=22;  -- 不能对同表进行操作
end; 

-- 查看现有触发器
SHOW TRIGGERS;

-- 删除触发器
DROP TRIGGER IF EXISTS after_test2_delete;

-- 测试触发器
delete from test2 
where s_id=3;
/*
报错:MySQL 不允许在触发器内部直接修改触发器所作用的表,因为这样会导致递归触发,触发器本身会再次被激活,导致死锁或无限循环
解决:1.使用另一个表记录操作 2.避免在触发器中直接更新触发的表:
*/

-- 删除
delete from test2 where s_name='匿名用户';

-- 查询所有
select * from test2;

-- 更新
UPDATE test2 set s_age=21;
posted @ 2025-01-03 12:14  一只大学生  阅读(32)  评论(0)    收藏  举报