亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

python 之 數據庫(視圖、觸發器、事務、存儲過程)

系統 1579 0

10.13 視圖

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

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

3、如何使用視圖

視圖記錄的增、刪、改和表方法相同,但改變視圖記錄,原始表也跟著改,所以不要修改視圖記錄,只用于查看

            
              create
            
            
              view
            
             teacher2course 
            
              as
            
            
                                              #創建視圖

            
            
              select
            
            
              *
            
            
              from
            
             teacher 
            
              inner
            
            
              join
            
             course 
            
              on
            
             teacher.tid 
            
              =
            
            
               course.teacher_id;
?

            
            
              alter
            
            
              view
            
             teacher2course 
            
              as
            
            
                                               #修改視圖名

            
            
              select
            
            
              *
            
            
              from
            
             teacher 
            
              inner
            
            
              join
            
             course 
            
              on
            
             teacher.tid 
            
              =
            
            
               course.teacher_id;
?

            
            
              drop
            
            
              view
            
             teacher2course;                                    #刪除視圖
          

強調: 1、在硬盤中,視圖只有表結構文件,沒有表數據文件 2、視圖通常用于查詢,盡量不要修改視圖中的數據

10.14 觸發器

觸發器:在滿足對某張表數據的 增、刪、改 的情況下,自動觸發的功能稱之為觸發器 觸發器專門針對我們對某一張表數據 增insert 刪delete 改update 的行為,這類行為一旦執行就會觸發觸發器的執行,即自動運行另外一段sql代碼

創建觸發器語法:

            # 針對插入(
            
              insert
            
            
              )

            
            
              create
            
            
              trigger
            
             tri_after_insert_t1 after 
            
              insert
            
            
              on
            
             表名 
            
              for
            
            
               each row

            
            
              begin
            
            
              
    sql代碼...

            
            
              end
            
            
              
?

            
            
              create
            
            
              trigger
            
             tri_before_insert_t2 before 
            
              insert
            
            
              on
            
             表名 
            
              for
            
            
               each row

            
            
              begin
            
            
              
    sql代碼...

            
            
              end
            
            
              
?
# 針對刪除(
            
            
              delete
            
            
              )

            
            
              create
            
            
              trigger
            
             tri_after_delete_t1 after 
            
              delete
            
            
              on
            
             表名 
            
              for
            
            
               each row

            
            
              begin
            
            
              
    sql代碼...

            
            
              end
            
            
              
?

            
            
              create
            
            
              trigger
            
             tri_before_delete_t2 before 
            
              delete
            
            
              on
            
             表名 
            
              for
            
            
               each row

            
            
              begin
            
            
              
    sql代碼...

            
            
              end
            
            
              
?
# 針對修改(
            
            
              update
            
            
              )

            
            
              create
            
            
              trigger
            
             tri_after_update_t1 after 
            
              update
            
            
              on
            
             表名 
            
              for
            
            
               each row

            
            
              begin
            
            
              
    sql代碼...

            
            
              end
            
            
              
?

            
            
              create
            
            
              trigger
            
             tri_before_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
              
              
                '
              
              
                ) );

              
              
                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 ;
?

              
              
                insert
              
              
                into
              
               cmd (
              
                USER
              
              ,priv,cmd,sub_time,success) 
              
                values
              
              
                
    (
              
              
                '
              
              
                egon
              
              
                '
              
              ,
              
                '
              
              
                0755
              
              
                '
              
              ,
              
                '
              
              
                ls -l /etc
              
              
                '
              
              ,NOW(),
              
                '
              
              
                yes
              
              
                '
              
              
                ),
    (
              
              
                '
              
              
                egon
              
              
                '
              
              ,
              
                '
              
              
                0755
              
              
                '
              
              ,
              
                '
              
              
                cat /etc/passwd
              
              
                '
              
              ,NOW(),
              
                '
              
              
                no
              
              
                '
              
              
                ),
    (
              
              
                '
              
              
                egon
              
              
                '
              
              ,
              
                '
              
              
                0755
              
              
                '
              
              ,
              
                '
              
              
                useradd xxx
              
              
                '
              
              ,NOW(),
              
                '
              
              
                no
              
              
                '
              
              
                ),
    (
              
              
                '
              
              
                egon
              
              
                '
              
              ,
              
                '
              
              
                0755
              
              
                '
              
              ,
              
                '
              
              
                ps aux
              
              
                '
              
              ,NOW(),
              
                '
              
              
                yes
              
              
                '
              
              
                );
?
mysql
              
              
                >
              
              
                select
              
              
                *
              
              
                from
              
              
                 errlog;        #查詢錯誤日志,發現有兩條

              
              
                +
              
              
                --
              
              
                --+-----------------+---------------------+
              
              
                |
              
               id 
              
                |
              
               err_cmd         
              
                |
              
               err_time            
              
                |
              
              
                +
              
              
                --
              
              
                --+-----------------+---------------------+
              
              
                |
              
              
                1
              
              
                |
              
               cat 
              
                /
              
              etc
              
                /
              
              passwd 
              
                |
              
              
                2017
              
              
                -
              
              
                09
              
              
                -
              
              
                14
              
              
                22
              
              :
              
                18
              
              :
              
                48
              
              
                |
              
              
                |
              
              
                2
              
              
                |
              
               useradd xxx     
              
                |
              
              
                2017
              
              
                -
              
              
                09
              
              
                -
              
              
                14
              
              
                22
              
              :
              
                18
              
              :
              
                48
              
              
                |
              
              
                +
              
              
                --
              
              
                --+-----------------+---------------------+
              
            
View Code

刪除觸發器:

            
              drop
            
            
              trigger
            
             tri_after_insert_cmd;
          

10.15 事務

什么是事務: 開啟一個事務可以包含一些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
            
            
              );
?
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元,出現異常沒有拿到

            
            
              rollback
            
            
              ;                                    #出現異常,回滾到初始狀態

            
            
              commit
            
            ;                                      #無異常,提交結果,提交后回滾無效
          

10.16 存儲過程

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

存儲過程的優點:1、用于替代程序寫的SQL語句,實現程序與sql解耦 2、基于網絡傳輸,傳別名的數據量小,而直接傳sql數據量大

存儲過程的缺點:程序員擴展功能不方便

10.161 創建與執行存儲過程

創建簡單存儲過程(無參):

            
              delimiter $$

            
            
              create
            
            
              procedure
            
            
               p1()

            
            
              BEGIN
            
            
              select
            
            
              *
            
            
              from
            
            
               blog;
    
            
            
              insert
            
            
              into
            
             blog(name,sub_time) 
            
              values
            
            
              ("xxx",now());

            
            
              END
            
            
               $$
delimiter ;
?
#在mysql中調用
call p1() 
?
#在python中基于pymysql調用

            
            
              cursor
            
            .callproc(
            
              '
            
            
              p1
            
            
              '
            
            
              ) 

            
            
              print
            
            (
            
              cursor
            
            .fetchall())
          

創建存儲過程(有參):

            
              delimiter $$

            
            
              create
            
            
              procedure
            
            
               p2(
    
            
            
              in
            
             m 
            
              int
            
            
              ,                           #只可傳入
    
            
            
              in
            
             n 
            
              int
            
            
              ,
    out res 
            
            
              int
            
            
              )                        #只可返回   # inout 既可以傳入又可以當作返回值

            
            
              begin
            
            
              select
            
             tname 
            
              from
            
             teacher 
            
              where
            
             tid 
            
              >
            
             m 
            
              and
            
             tid 
            
              <
            
            
               n;
    
            
            
              set
            
             res
            
              =
            
            
              1
            
            
              ;                          #執行成功res返回0

            
            
              end
            
            
               $$
delimiter ;
?
#在mysql中調用

            
            
              set
            
            
              @res
            
            
              =
            
            
              0
            
            
              ;
call p2(
            
            
              3
            
            ,
            
              2
            
            ,
            
              @res
            
            
              )

            
            
              select
            
            
              @res
            
            
              ;                            #0代表假(執行失敗),1代表真(執行成功)
?
#在python中基于pymysql調用

            
            
              cursor
            
            .callproc(
            
              '
            
            
              p2
            
            
              '
            
            ,(
            
              2
            
            ,
            
              3
            
            ,
            
              0
            
            ))            #0相當于set 
            
              @res
            
            
              =
            
            
              0
            
            
              print
            
            (
            
              cursor
            
            
              .fetchall())                #查詢select的查詢結果
?

            
            
              cursor
            
            .
            
              execute
            
            (
            
              '
            
            
              select @_p2_2;
            
            
              '
            
            )         #
            
              @_p2_2代表第三個參數
            
            
              ,即返回值

            
            
              print
            
            (
            
              cursor
            
            .fetchall())
          

將事務封裝入存儲過程:

              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
              
              
                ; 
        
              
              
                DELETE
              
              
                from
              
              
                 tb1; #執行失敗
        
              
              
                insert
              
              
                into
              
               blog(name,sub_time) 
              
                values
              
              (
              
                '
              
              
                yyy
              
              
                '
              
              
                ,now());
    
              
              
                COMMIT
              
              
                ; 
?
    
              
              
                --
              
              
                 SUCCESS 
              
              
                set
              
               p_return_code 
              
                =
              
              
                0
              
              
                ; #0代表執行成功
?

              
              
                END
              
              
                //
              
              
                
delimiter ;
?
#在mysql中調用存儲過程

              
              
                set
              
              
                @res
              
              
                =
              
              
                123
              
              
                ;
call p5(
              
              
                @res
              
              
                );

              
              
                select
              
              
                @res
              
              
                ;
?
#在python中基于pymysql調用存儲過程

              
              
                cursor
              
              .callproc(
              
                '
              
              
                p5
              
              
                '
              
              ,(
              
                123
              
              
                ,))

              
              
                print
              
              (
              
                cursor
              
              
                .fetchall()) #查詢select的查詢結果
?

              
              
                cursor
              
              .
              
                execute
              
              (
              
                '
              
              
                select @_p5_0;
              
              
                '
              
              
                )

              
              
                print
              
              (
              
                cursor
              
              .fetchall())
            
View Code

10.162 刪除存儲過程

            
              drop
            
            
              procedure
            
             proc_name;
          

回到頂部


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。。?/p>

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 一级特级毛片 | 成人毛片网 | 深夜福利国产精品亚洲尤物 | 日本一级毛片视频网站 | 成人午夜精品久久久久久久小说 | 亚洲女人国产香蕉久久精品 | 久久91精品牛牛 | 国产精品视频免费的 | 色片在线看 | 亚洲综合插插 | 中文字幕亚洲综合精品一区 | 可以直接看的毛片 | 色花堂国产精品第二页 | 未成人做爰视频www 我爱52avαv永久网站 | 亚洲视频在线观看一区 | sss欧美华人整片在线观看 | 久久免费看视频 | 不卡视频在线观看 | 亚洲图片综合网 | 国产精品一级香蕉一区 | 欧美日韩激情在线一区二区 | 黄色片一级毛片 | 婷婷春色 | 狼人香蕉香蕉在线视频播放 | 黄色免费网站在线观看 | 亚洲线精品久久一区二区三区 | 996热精品视频在线观看 | 国产色综合久久无码有码 | 色在线综合 | 成人免费毛片视频 | 狠狠色噜噜狠狠狠狠黑人 | 久久婷婷国产一区二区三区 | 麻豆国产原创最新在线视频 | 亚洲swag精品自拍一区 | 国产99在线a视频 | 5151四虎永久在线精品免费 | 99爱视频在线 | 亚洲高清中文字幕一区二区三区 | 一级特级欧美午夜片免费观看 | 久久精品在线播放 | 一本一本久久a久久精品综合麻豆 |