1. 程式人生 > >mysql批處理/觸發器/事務管理/存儲過程

mysql批處理/觸發器/事務管理/存儲過程

查看 rop 插入 hms call 執行 查詢 mit 員工

mysql裏的批處理(sql語句)

格式:

l mysql u user p < sql_file

表示從某個文件裏執行sql語句

l mysql u user p < sql_file > out_file

表示從某個文件裏執行,並將執行結果保存到out_file文件之中

舉個例子:

小王每天早晨來之後,都需要查詢班級共有多少人,還要查本學期共有幾門課程,還要查詢最近的考試成績。。。。。。。。需要做很多操作

sql.txt裏

use pingtai; //選擇數據庫

select * from users limit 5; //sql語句

delete from users where id = 6; //只有查詢輸出結果、插入、修改、刪除不會輸出結果

需要將以上操作存放至一個sql腳本,然後

技術分享

技術分享

這個例題可以將輸出的查詢結果保存到student.xls文件裏。

觸發器

l 觸發器是屬於某一個表的

l 當在這個表上執行插入、更新或刪除操作的時候就導致觸發器的激活

l 我們不能給同一張表的同一個事件安排兩個觸發器

語法:

l create trigger trigger_name before | after insert | update | delete on table_name

for each row

begin

sql

end

create trigger:關鍵字

trigger_name:觸發器名稱(自定義)

trigger_time:觸發時間,取值範圍:before(之前)和after(之後)

trigger_event:觸發事件,取值範圍:insertupdatedelete

on:關鍵字

table_name:表名

for each row:關鍵字

begin:開始(關鍵字)

sqlsql語句(可以有多條語句)

end:結束(關鍵字)

管理觸發器

l show triggers;

查詢當前數據庫下所有表的觸發器

information_schema數據庫下,有一個表叫triggers,

裏面保存了所有數據的觸發器信息

l drop triggers trigger_name ;

刪除觸發器

例題1

l 在新同學入學時,將他的姓名和年齡存至另外一個表內

創建觸發器

技術分享

使用觸發器

技術分享

student表插入數據的之後,會向stu表插入新數據的姓名和年齡

關鍵字newold的區別:

技術分享

2

l 刪除一個部門之前,先刪除掉這個部門下的所有員工

Delete from department where name=市場部;

技術分享

市場部

Old.id=1

3

記錄學生的改名記錄

當一個學生改名時,把原名和新名插入到一個表中,並保存改名的時間

技術分享

事務管理

為保證數據庫內容的一致,就要將數據庫的一組操作作為一個整體來進行,要麽全部成功完成,要麽全部失敗退出。

開啟事務處理的方式:

l 標準事務:start transaction

l 非標準:set autocommit=0

區別?????????

標準的:遇到commitrollback語句,則認為是事務終止,後面的語句會立即寫入到文件

非標準的:即使遇到commitrollback語句,後面語句仍然處於事務之中,說明不會寫入到文件

l set autocommit = { 0 | 1 } 設置是否為自動提交

set autocommit=0:表示關閉自動提交模式

set autocommit=1:表示開啟自動提交模式

l start transaction:開啟標準事務

l commit:提交事務

l rollback:回滾事務

Set autocommit=0; //關閉自動提交模式

Delete from student;

Delete from subject;

//到此為止,數據沒有真正寫入到文件

//Commit;

//如果執行commit,數據真正寫入

//Rollback

//事務回滾

問題?

10條數據

先刪除 3

Commit;

先刪除3

Rollback;

Savepoint 還原點1;

操作………………..

Savepoint 還原點2;

操作………………

Savepoint 還原點3;

操作………………

Rollback to 還原點(還原到指定的還原點)

還原到指定的還原點之後,這個還原點之後的還原點會自動消失

存儲過程

l 大型數據庫系統中,一組為了完成特定功能的SQL 語句集,經編譯後存儲在數據庫中,用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。

存儲過程像是我們SQL裏的函數

我們只需要定義存儲過程,在調用時,通過指定參數,就可以幫助我們完成一些功能!

1、創建語法:

create procedure sp_name

[參數名] [類型],[參數名] [類型]

 begin

 .........

 end

create procedure:關鍵字(創建存儲過程)

sp_name:存儲過程名稱

[type]inoutinout

in:輸入參數(在調用存儲過程時,必須指定)

out:輸出參數(必須指定,可以在存儲過程中被修改)

[參數名]

[參數類型]:數據類型

Begin:關鍵字

Sql

Sql

End:關鍵字

2、查看與刪除

select name from mysql.proc where db=’數據庫名’;

我們創建的所有存儲的信息,會保存到mysql數據庫下proc表中

show procedure status where db=‘數據庫名‘;

show create procedure 數據庫.存儲

3、調用語法:

call sp_name [參數名]

1

l 執行一條插入數據的語句

技術分享

調用以上這個存儲過程:

call proc1();

4、關於參數

In:輸入參數(如果不指定,默認為in

Out:輸出參數

Inout:輸入輸出參數

2

創建一個存儲過程,要求有兩個輸入參數分別為姓名和年齡,用戶調用存儲過程時需要指定兩個參數,然後將傳遞的值插入至表中。

技術分享

call proc(楚留香,30);

3

查詢年齡最大的同學的姓名

Select name from student order by age desc limit 1;

技術分享

技術分享

4

創建一個存儲過程,要求可根據學生編號查詢出學生的姓名和年齡

學生編號:輸入參數

姓名:輸出參數

年齡:輸出參數

技術分享

mysql批處理/觸發器/事務管理/存儲過程