一、视图
视图是一个虚拟表,其本质是(根据SQL语句获取动态的数据集),用户使用时只需使用名称即可获取结果集,可以将该结果集当做表来使用。
1、创建视图
create view teacher_view as select tid from teacher where tname='aa'
2、 使用视图
select * from course
3、修改视图
alter view teacher_view as select * from course where cid>3;
4、删除视图
drop view teacher_view
二、触发器
使用触可以定制用户对表进行(增、删、改)操作时前后的行为
# 插入前
CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW
BEGIN
...
END
# 插入后
CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW BEGIN ... END # 删除前 CREATE TRIGGER tri_before_delete_tb1 BEFORE DELETE ON tb1 FOR EACH ROW BEGIN ... END # 删除后 CREATE TRIGGER tri_after_delete_tb1 AFTER DELETE ON tb1 FOR EACH ROW BEGIN ... END # 更新前 CREATE TRIGGER tri_before_update_tb1 BEFORE UPDATE ON tb1 FOR EACH ROW BEGIN ... END # 更新后 CREATE TRIGGER tri_after_update_tb1 AFTER UPDATE ON tb1 FOR EACH ROW BEGIN ... END
二使用触发器
触发器无法由用户直接调用,而是由对表的增删改操作面被动引发的
drop trigger tri_after_insert_cmd
三、事务
事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证
数据库数据完整性。
create table user(
id int primary key auto_increment,
name char(32),
balance int
);
insert into user(name,balance)
values
('wsb',1000),
('egon',1000),
('ysb',1000);
#原子操作
start transaction;
update user set balance=900 where name='wsb'; #买支付100元
update user set balance=1010 where name='egon'; #中介拿走10元
update user set balance=1090 where name='ysb'; #卖家拿到90元
commit;
#出现异常,回滚到初始状态
start transaction;
update user set balance=900 where name='wsb'; #买支付100元
update user set balance=1010 where name='egon'; #中介拿走10元
uppdate user set balance=1090 where name='ysb'; #卖家拿到90元,出现异常没有拿到
rollback;
commit;
mysql> select * from user;
+----+------+---------+
| id | name | balance |
+----+------+---------+
| 1 | wsb | 1000 |
| 2 | egon | 1000 |
| 3 | ysb | 1000 |
+----+------+---------+
rows in set (0.00 sec)
四存储过程
存储过程包含了一系列可执行的sql语句,存储过程放于Mysql中,通过调用它名字内部的一堆 sql
使用存储过程的优点:
1、用于替代程序写的sql语名,实现程序与sql解耦和
2、基于网络传输,传别名的数量小,而直接传sql数据量大
缺点:
1、跨部门沟通烦锁
程序与数据库结合使用的三种方式
方式一:
mysql:存储过程
程序:调用存储过程
方式二:
mysq:
程序纯sql语句
方式三:
mysql:
程序:类和对象,即orm
二创建存储过程有参
in 入参
out 出参
inout 既可当入参与可当出参
delimiter //
create procedure p5(
OUT p_return_code tinyint
)
begin
declare exit handler for sqlexception
begin
set p_return_code=1;
rollback;
end;
declare exit handler for sqlwarning
begin
set p_return_code=2;
rollback;
end
start transaction;
delete from tb1;
insert into blog(name,sub_time) value ('aa',now())
commit;
set p_return_code=0;
end//
delimiter;