1. 程式人生 > >視圖,觸發器,事務與存儲過程

視圖,觸發器,事務與存儲過程

流程控制 ID pytho har insert HERE 操作 fetchall 自動

視圖

什麽是視圖

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

為什麽要用視圖

如果要頻繁使用一張虛擬表,可以不用重復查詢

如何創建視圖

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

強調

1、在硬盤中,視圖只有表結構文件,沒有表數據文件
2、視圖通常是用於插敘,盡量不要修改視圖中的數據

刪除視圖

drop view teacher2course;

觸發器

什麽是觸發器

在滿足對某張表數據的增,刪,改的情況下,自動觸發的功能稱之為觸發器

為什麽要用觸發器

觸發器專門針對我們對某一張表數據增insert、刪delete、改update的行為,這類行為一旦執行就會觸發觸發器的執行,即自動運行另外一段sql代碼

創建觸發器的語法

# 針對插入
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

案例代碼

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 ;

註意

上面的代碼中: delimiter $$ 和deliniter ;
  sql中;為語句的默認結束符號,為了讓sql正確識別語句,所以需要修改默認的結束符號。
  語句完成之後,再次修改為默認的符號。

刪除觸發器

drop trigger tri_after_insert_cmd;

事務

什麽是事務

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

事務的作用

事務用於將某些操作的多個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);

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;#沒有異常,則提交修改

存儲過程

什麽是存儲過程

存儲過程包含了一系列可執行的sql語句,存儲過程存放於MySQL中,通過調用它的名字可以執行其內部的一堆sql

三種開發模型

一、        

應用程序:只需要開發應用程序的邏輯
mysql:編寫好存儲過程,以供應用程序調用
優點:開發效率,執行效率都高
缺點:考慮到人為因素、跨部門溝通等問題,會導致擴展性差
二、
應用程序:除了開發應用程序的邏輯,還需要編寫原生sql
mysql:不做操作
優點:比方式1,擴展性高(非技術性的)
缺點:
1、開發效率,執行效率都不如方式1
2、編寫原生sql太過於復雜,而且需要考慮到sql語句的優化問題
三、
應用程序:開發應用程序的邏輯,不需要編寫原生sql,基於別人編寫好的框架來處理數據,ORM
mysql:不做操作
優點:不用再編寫純生sql,這意味著開發效率比方式2高,同時兼容方式2擴展性高的好處
缺點:執行效率連方式2都比不過

創建存儲過程

對於存儲過程,可以接收參數,其參數有三類:
in 僅用於傳入參數用
out 僅用於返回值用
inout 既可以傳入又可以當作返回值

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);
查看結果
select @res;

2、在python程序中調用
cursor.callproc(‘p1‘)
print(cursor.fetchall())

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 ;

刪除存儲過程
drop procedure proc_name;

函數

!!!註意!!!
函數中不要寫sql語句(否則會報錯),函數僅僅只是一個功能,是一個在sql中被應用的功能
若要想在begin...end...中寫sql,請用存儲過程

流程控制

全文參考

視圖,觸發器,事務與存儲過程