mysql事务、视图、触发器
MySQL事务
点击查看代码
#创建数据库表
create table if not exists runoob_transaction_test(id int(5))engine=innodb;
select * from runoob_transaction_test;
#禁止自动提交
set autocommit=0;
#开启事务
BEGIN;
#sql语句
insert into runoob_transaction_test(id) values (1);
insert into runoob_transaction_test(id) values (2);
select * from runoob_transaction_test;
#提交事务
commit;
select * from runoob_transaction_test;
#开启事务
begin;
#插入语句
insert into runoob_transaction_test(id) values(7);
#回滚
rollback;
select * from runoob_transaction_test;
MySQL视图
作用:方便于查询,相当于虚拟表,依赖于基表,但是又不存在于磁盘里
点击查看代码
USE info;
#创建作者表
CREATE TABLE IF NOT EXISTS author(
id INT NOT NULL AUTO_INCREMENT,
author_name VARCHAR(50) DEFAULT NULL,
PRIMARY KEY(id)
);
INSERT INTO author(author_name)VALUES('naamman'),
('lucy'),('lily'),('jack');
#创建博客表
CREATE TABLE IF NOT EXISTS blog(
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(50) DEFAULT NULL,
content VARCHAR(100) DEFAULT NULL,
author_id INT DEFAULT NULL
);
INSERT INTO blog(title,content,author_id)VALUES
('测试博客01','博客内容01',1),
('测试博客02','博客内容02',2),
('测试博客03','博客内容03',3),
('测试博客04','博客内容04',4);
#创建视图:逻辑上的虚拟表
CREATE VIEW v_author(编号,姓名)
AS
SELECT * FROM author WITH CHECK OPTION;
#查询视图
SELECT * FROM v_author;
create view v_a_b(作者名字,博客标题,博客内容)
as
SELECT a.author_name,b.title,b.content FROM author a left join blog b on a.id=b.author_id;
#修改视图
create or replace view v_blog(编号,标题,内容,作者编号)
as select * from blog with check option;
#修改视图的数据 ->修改基表数据
update v_blog set 内容='修改后的内容' where 编号=1;
#部分数据创建视图
create or replace view v_blog_1(编号,标题,内容,作者编号)
as
select * from blog where author_id=1
with check option;
#with check option:受where条件约束
insert into v_blog_1(编号,标题,内容,作者编号)
values
(10,'123','123',1) ;
MySQL触发器
作用:可以同时触发多条事件并语句
点击查看代码
USE test;
#创建学生表
CREATE TABLE IF NOT EXISTS student
(
username VARCHAR(50),
PASSWORD VARCHAR(50),
stuid INT PRIMARY KEY AUTO_INCREMENT,
birthday DATE
)ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
#插入数据
INSERT INTO student(username,PASSWORD,birthday)
VALUES
(
'王二','11111','2016-08-23'
);
#成绩表
CREATE TABLE IF NOT EXISTS cj
(
num INT PRIMARY KEY AUTO_INCREMENT,
stu_id INT,
stu_name VARCHAR(50),
math FLOAT,
chinese FLOAT,
english FLOAT
)ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
#触发器 插入数据
DELIMITER $
CREATE TRIGGER stu_cj
AFTER INSERT ON student FOR EACH ROW
BEGIN
INSERT INTO cj(stu_id,stu_name)VALUES(new.stuid,new.username);
END $
DELIMITER ;
#插入数据
INSERT INTO student(username,PASSWORD,birthday)
VALUES
(
'张三','1113311','2011-08-23'
);
#触发器2 删除数据
DELIMITER $
CREATE TRIGGER del
AFTER DELETE ON student FOR EACH ROW
BEGIN
DELETE FROM cj WHERE cj.stu_id=old.stuid;
END $
DELIMITER ;
#触发器3 修改数据
DELIMITER $
CREATE TRIGGER upd
AFTER UPDATE ON student FOR EACH ROW
BEGIN
UPDATE cj SET cj.stu_name=old.username WHERE cj.stu_id=old.stuid;
END $
DELIMITER ;
UPDATE student SET username='小明' WHERE username='王二';
#创建存储过程
DELIMITER $
CREATE PROCEDURE testa()
BEGIN
SELECT * FROM student;
SELECT * FROM cj;
END $
DELIMITER ;
#调用存储过程
CALL testa();
#创建存储过程
DELIMITER $
CREATE PROCEDURE testb()
BEGIN
#声明变量类型
DECLARE un VARCHAR(32) DEFAULT '';
#给username变量赋值
SET un='李白';
#将查询结果赋值给un变量
SELECT username INTO un FROM student WHERE stuid = 2;
#查询un变量,返回
SELECT un;
END $
DELIMITER ;
#调用存储过程
CALL testb();
#变量的作用范围
DELIMITER $
CREATE PROCEDURE testc()
BEGIN
BEGIN
#声明变量类型
DECLARE un VARCHAR(32) DEFAULT '';
#给username变量赋值
SET un='李白';
#将查询结果赋值给un变量
SELECT username INTO un FROM student WHERE stuid = 1;
#查询un变量,返回
SELECT un;
END;
BEGIN
#声明变量类型
DECLARE us VARCHAR(32) DEFAULT '';
#给username变量赋值
SET us='里斯';
#将查询结果赋值给un变量
SELECT username INTO us FROM student WHERE stuid = 2;
#查询un变量,返回
SELECT us;
END;
END $
DELIMITER ;
#调用存储过程
CALL testc();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构