欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

python 之 數(shù)據(jù)庫(kù)(視圖、觸發(fā)器、事務(wù)、存儲(chǔ)過(guò)程)

系統(tǒng) 1637 0

10.13 視圖

1、什么是視圖 視圖就是通過(guò)查詢得到一張?zhí)摂M表,然后保存下來(lái),下次用的直接使用即可

2、為什么要用視圖 如果要頻繁使用一張?zhí)摂M表,可以不用重復(fù)查詢

3、如何使用視圖

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

            
              create
            
            
              view
            
             teacher2course 
            
              as
            
            
                                              #創(chuàng)建視圖

            
            
              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;                                    #刪除視圖
          

強(qiáng)調(diào): 1、在硬盤中,視圖只有表結(jié)構(gòu)文件,沒有表數(shù)據(jù)文件 2、視圖通常用于查詢,盡量不要修改視圖中的數(shù)據(jù)

10.14 觸發(fā)器

觸發(fā)器:在滿足對(duì)某張表數(shù)據(jù)的 增、刪、改 的情況下,自動(dòng)觸發(fā)的功能稱之為觸發(fā)器 觸發(fā)器專門針對(duì)我們對(duì)某一張表數(shù)據(jù) 增insert 、 刪delete 、 改update 的行為,這類行為一旦執(zhí)行就會(huì)觸發(fā)觸發(fā)器的執(zhí)行,即自動(dòng)運(yùn)行另外一段sql代碼

創(chuàng)建觸發(fā)器語(yǔ)法:

            # 針對(duì)插入(
            
              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
            
            
              
?
# 針對(duì)刪除(
            
            
              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
            
            
              
?
# 針對(duì)修改(
            
            
              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
              
              
                , #提交時(shí)間
    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
              
              
                      #等值判斷只有一個(gè)等號(hào)
        
              
              
                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;        #查詢錯(cuò)誤日志,發(fā)現(xiàn)有兩條

              
              
                +
              
              
                --
              
              
                --+-----------------+---------------------+
              
              
                |
              
               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

刪除觸發(fā)器:

            
              drop
            
            
              trigger
            
             tri_after_insert_cmd;
          

10.15 事務(wù)

什么是事務(wù): 開啟一個(gè)事務(wù)可以包含一些sql語(yǔ)句,這些sql語(yǔ)句要么同時(shí)成功,要么都不成功,稱之為事務(wù)的原子性 作用:事務(wù)用于將某些操作的多個(gè)SQL作為原子性操作,一旦有某一個(gè)出現(xiàn)錯(cuò)誤,即可回滾到原來(lái)的狀態(tài),從而保證數(shù)據(jù)庫(kù)數(shù)據(jù)完整性。

            
              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
            
            
              ;                            #開啟事務(wù)

            
            
              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元,出現(xiàn)異常沒有拿到

            
            
              rollback
            
            
              ;                                    #出現(xiàn)異常,回滾到初始狀態(tài)

            
            
              commit
            
            ;                                      #無(wú)異常,提交結(jié)果,提交后回滾無(wú)效
          

10.16 存儲(chǔ)過(guò)程

存儲(chǔ)過(guò)程包含了一系列可執(zhí)行的sql語(yǔ)句,存儲(chǔ)過(guò)程存放于MySQL中,通過(guò)調(diào)用它的名字可以執(zhí)行其內(nèi)部的一堆sql

存儲(chǔ)過(guò)程的優(yōu)點(diǎn):1、用于替代程序?qū)懙腟QL語(yǔ)句,實(shí)現(xiàn)程序與sql解耦 2、基于網(wǎng)絡(luò)傳輸,傳別名的數(shù)據(jù)量小,而直接傳sql數(shù)據(jù)量大

存儲(chǔ)過(guò)程的缺點(diǎn):程序員擴(kuò)展功能不方便

10.161 創(chuàng)建與執(zhí)行存儲(chǔ)過(guò)程

創(chuàng)建簡(jiǎn)單存儲(chǔ)過(guò)程(無(wú)參):

            
              delimiter $$

            
            
              create
            
            
              procedure
            
            
               p1()

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

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

            
            
              cursor
            
            .callproc(
            
              '
            
            
              p1
            
            
              '
            
            
              ) 

            
            
              print
            
            (
            
              cursor
            
            .fetchall())
          

創(chuàng)建存儲(chǔ)過(guò)程(有參):

            
              delimiter $$

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

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

            
            
              end
            
            
               $$
delimiter ;
?
#在mysql中調(diào)用

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

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

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

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

            
            
              print
            
            (
            
              cursor
            
            .fetchall())
          

將事務(wù)封裝入存儲(chǔ)過(guò)程:

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

              
              
                END
              
              
                //
              
              
                
delimiter ;
?
#在mysql中調(diào)用存儲(chǔ)過(guò)程

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

              
              
                select
              
              
                @res
              
              
                ;
?
#在python中基于pymysql調(diào)用存儲(chǔ)過(guò)程

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

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

              
              
                cursor
              
              .
              
                execute
              
              (
              
                '
              
              
                select @_p5_0;
              
              
                '
              
              
                )

              
              
                print
              
              (
              
                cursor
              
              .fetchall())
            
View Code

10.162 刪除存儲(chǔ)過(guò)程

            
              drop
            
            
              procedure
            
             proc_name;
          

回到頂部


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦?。?!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: www成人国产在线观看网站 | 国产婷婷在线观看 | 欧美日韩国产综合一区二区三区 | 久久久精品中文字幕 | 久草精品视频 | 亚洲精品成人AA片在线播 | 天天操 夜夜操 | 老汉色影院 | 国产免费A片好硬好爽好深小说 | 国产精品亚洲综合第一区 | 亚洲日本中文字幕在线2022 | 亚洲综合色婷婷久久 | 免费欧美黄色 | 久久精品夜夜夜夜夜久久 | 成人午夜网站 | 欧美精品中文字幕久久二区 | 欧美另类视频在线 | 欧美精品久久久 | 亚洲第一区视频在线观看 | 天天操婷婷 | 色欧美色 | 亚洲国产国产综合一区首页 | www.久久99| 午夜在线成人 | 日日a.v拍夜夜添久久免费 | 99色综合 | 日韩精品一级毛片 | 亚洲国产精品久久久久秋霞蜜臀 | 中文在线视频 | 国产无圣光高清一区二区 | 久久亚洲第一 | 久久免费播放视频 | 一区二区三区四区视频 | 精品免费| 国产色产综合色产在线观看视频 | 婷婷免费视频 | www.riben| 亚洲黑人在线观看 | 久久综合九色综合97婷婷群聊 | 二区三区视频 | 综合九九 |