1. 程式人生 > >檢視——觸發器——事務——儲存過程

檢視——觸發器——事務——儲存過程

1、什麼是檢視
檢視就是通過查詢得到一張虛擬表,然後儲存下來,下次用的直接使用即可

2、為什麼要用檢視
如果要頻繁使用一張虛擬表,可以不用重複查詢

3、如何用檢視

create view teacher2course as
select * from teacher inner join course
on teacher.tid = course.teacher_id;


強調
1、在硬碟中,檢視只有表結構檔案,沒有表資料檔案
2、檢視通常是用於插敘,儘量不要修改檢視中的資料


drop view teacher2course;
————————————————————————————————————————————————————————————————————————————————
01 觸發器
在滿足對某張表資料的增、刪、改的情況下,自動觸發的功能稱之為觸發器

02 為何要用觸發器?
觸發器專門針對我們對某一張表資料增insert、刪delete、改update的行為,這類行為一旦執行
就會觸發觸發器的執行,即自動執行另外一段sql程式碼

03 建立觸發器語法
# 針對插入
create trigger tri_after_insert_t1 after insert on 表名 for each row
begin
sql程式碼。。。
end

create trigger tri_after_insert_t2 before insert on 表名 for each row
begin
sql程式碼。。。
end


# 針對刪除
create trigger tri_after_delete_t1 after delete on 表名 for each row
begin
sql程式碼。。。
end

create trigger tri_after_delete_t2 before delete on 表名 for each row
begin
sql程式碼。。。
end


# 針對修改
create trigger tri_after_update_t1 after update on 表名 for each row
begin
sql程式碼。。。
end

create trigger tri_after_update_t2 before update on 表名 for each row
begin
sql程式碼。。。
end

04 案例
CREATE TABLE cmd (
id INT PRIMARY KEY auto_increment,
USER CHAR (32),
priv CHAR (10),
cmd CHAR (64),
sub_time datetime, #提交時間
success enum ('yes', 'no') #0代表執行失敗
);

CREATE TABLE errlog (
id INT PRIMARY KEY auto_increment,
err_cmd CHAR (64),
err_time datetime
);

delimiter $$
create trigger tri_after_insert_cmd after insert on cmd for each row
begin
if NEW.success = 'no' then
insert into errlog(err_cmd,err_time) values(NEW.cmd,NEW.sub_time);
end if;
end $$
delimiter ;


drop trigger tri_after_insert_cmd;

————————————————————————————————————————————————————————————
01 什麼是事務
開啟一個事務可以包含一些sql語句,這些sql語句要麼同時成功
要麼一個都別想成功,稱之為事務的原子性

02 事務的作用


03 如何用
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);

try:
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元
except 異常:
rollback;
else:
commit;
————————————————————————————————————————————————————————
01 儲存過程
儲存過程包含了一系列可執行的sql語句,儲存過程存放於MySQL中,通過呼叫它的名字可以執行其內部的一堆sql


02 三種開發模型
1、
應用程式:只需要開發應用程式的邏輯
mysql:編寫好儲存過程,以供應用程式呼叫

優點:開發效率,執行效率都高
缺點:考慮到人為因素、跨部門溝通等問題,會導致擴充套件性差

2、
應用程式:除了開發應用程式的邏輯,還需要編寫原生sql
mysql:

優點:比方式1,擴充套件性高(非技術性的)
缺點:
1、開發效率,執行效率都不如方式1
2、編寫原生sql太過於複雜,而且需要考慮到sql語句的優化問題


3、
應用程式:開發應用程式的邏輯,不需要編寫原生sql,基於別人編寫好的框架來處理資料,ORM
mysql:

優點:不用再編寫純生sql,這意味著開發效率比方式2高,同時相容方式2擴充套件性高的好處
缺點:執行效率連方式2都比不過

03 建立儲存過程

delimiter $$
create procedure p1(
in m int, #接收值
in n int, #接收值
out res int #返回值
)
begin
select tname from teacher where tid > m and tid < n;
set res=0; #用於返回
end $$
delimiter ;

# 如何用儲存過程
#1、直接在mysql中呼叫
set @res=10
call p1(2,4,10); 錯誤使用

call p1(2,4,@res) 正確使用

#檢視結果
select @res;

#2、在python程式中呼叫
PS: 哪裡定義 哪裡用

#3、事務的使用
delimiter //
create PROCEDURE p5(
OUT p_return_code tinyint
)
BEGIN
DECLARE exit handler for sqlexception
BEGIN
-- ERROR
set p_return_code = 1;
rollback;
END;

DECLARE exit handler for sqlwarning
BEGIN
-- WARNING
set p_return_code = 2;
rollback;
END;

START TRANSACTION;
update user set balance=900 where id =1;
update user123 set balance=1010 where id = 2;
update user set balance=1090 where id =3;
COMMIT;

-- SUCCESS
set p_return_code = 0; #0代表執行成功

END //
delimiter ;



delimiter //
create PROCEDURE p6(
OUT p_return_code tinyint
)
BEGIN
DECLARE exit handler for sqlexception
BEGIN
-- ERROR
set p_return_code = 1;
rollback;
END;

DECLARE exit handler for sqlwarning
BEGIN
-- WARNING
set p_return_code = 2;
rollback;
END;

START TRANSACTION;
update user set balance=900 where id =1;
update user set balance=1010 where id = 2;
update user set balance=1090 where id =3;
COMMIT;

-- SUCCESS
set p_return_code = 0; #0代表執行成功

END //
delimiter ;
——————————————————————————————————————————————————————
1、強調:mysql內建的函式只能在sql語句中使用

mysql> select date_format(sub_time,'%Y-%m'),count(id) from blog group by date_format(sub_time,'%Y-%m');