mysql批處理/觸發器/事務管理/存儲過程
格式:
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:觸發事件,取值範圍:insert、update、delete
on:關鍵字
table_name:表名
for each row:關鍵字
begin:開始(關鍵字)
sql:sql語句(可以有多條語句)
end:結束(關鍵字)
管理觸發器
l show triggers;
查詢當前數據庫下所有表的觸發器
在information_schema數據庫下,有一個表叫triggers,
l drop triggers trigger_name ;
刪除觸發器
例題1:
l 在新同學入學時,將他的姓名和年齡存至另外一個表內
創建觸發器
使用觸發器
向student表插入數據的之後,會向stu表插入新數據的姓名和年齡
關鍵字new和old的區別:
例2:
l 刪除一個部門之前,先刪除掉這個部門下的所有員工
Delete from department where name=’市場部’;
市場部
Old.id=1
例3:
記錄學生的改名記錄
當一個學生改名時,把原名和新名插入到一個表中,並保存改名的時間
事務管理
為保證數據庫內容的一致,就要將數據庫的一組操作作為一個整體來進行,要麽全部成功完成,要麽全部失敗退出。
開啟事務處理的方式:
l 標準事務:start transaction
l 非標準:set autocommit=0
區別?????????
標準的:遇到commit或rollback語句,則認為是事務終止,後面的語句會立即寫入到文件
非標準的:即使遇到commit或rollback語句,後面語句仍然處於事務之中,說明不會寫入到文件
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]:in、out、inout
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批處理/觸發器/事務管理/存儲過程