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;

浙公网安备 33010602011771号