儲存程式 2 MYSQL

2022-03-07 05:42:16 字數 4467 閱讀 6334

1.觸發器

觸發器是與特定資料表相關聯的儲存過程,當相應的資料表被insert、delete或update語句修改時,觸發器將自動執行。觸發器可以被設定成在這幾種語句處理每個資料行之前或之後觸發。觸發器的定義包括一條將在觸發器被觸發時執行的語句。

下面描述了觸發器提供的一些好處:

1.觸發器可以檢查或修改將被插入或用來更新資料行的新資料值。這意味著我們可以利用觸發器強制實現資料的完整性,比如檢查某個百分比數值是不是落在了0到ioo的區間內。觸發器還可以用來對輸入資料進行必要的過濾。

2.觸發器可以把表示式的結果賦值給資料列作為其預設值。這使我們可以繞開資料列定義裡的預設值必須是常數的限制。

3.觸發器可以在刪除或修改資料行之前先檢查它的當前內容。這種能力可以用來實現許多功能,例如把對現有資料行的修改記載到乙個日誌裡。

觸發器要用create trigger語句來建立。在觸發器的定義裡需要表明它將由哪種語句(insert,update或delete)觸發,是在資料行被修改之前還是之後被觸發。觸發器建立語句的基本語法如下所示:

create

trigger trigger_name #the trigger

name

#when the trigger

activates

#what statement activates it

on tbl_name #the associated table

for each row trigger_stmt; #what the triaaer does

trigger_stmt是觸發器的語句體部分,也就是在觸發器被觸發時將要執行的語句。在觸發器的語句體裡,可以使用new.col_name語法來引用將由insert或update語句插人或修改的新資料行裡的資料列。類似地,old.col_name語法可以用來引用將由delete或update語句刪除或修改的老資料行裡的資料列。比如說,如果你想在新資料行被插人資料表之前改變它的某個資料列的值,只需建立乙個before觸發器並在其語句體裡寫出相應的「set new.col name =value」語句即可。

在下面的例子裡,我們為資料表t上的insert語句建立了乙個名為bi_t的觸發器。資料表t有乙個整數型別的percent資料列用來儲存百分比數值(0到100)和乙個datetime資料列。我們在定義這個觸發器時使用了before關鍵字,所以它將在資料值被插人資料表之前對它們進行檢查:

create

table t(percent

int, dt datetime

);delimiter $

create

trigger bi_t before insertont

foreach row

begin

set new.dt=

current_timestamp

;

if new.percent

<

0then

set new.percent=0

; elseif new.

percent

>

100then

set new.percent

=100

;

endif

;end

$delimiter ;

這個觸發器將完成如下兩個動作:

1.如果將被插人的百分比值超出了0到100的範圍,這個觸發器將把該值轉換為最近的邊界值(0或100)。

2.這個觸發器將自動地為那個datetime資料列提供乙個current_timestamp值。從效果上看,這繞開了「資料列的預設值必須是乙個常數」的限制,讓datetime資料列具備了類似於timestamp資料列的自動初始化能力。

insert

into t (percent) values(-

2); do sleep(2

);insert

into t (percent) values(30); do sleep(2

);insert

into t (percent) values(120

);select

*from t;

先在資料表裡插人一些資料行,然後再檢索它的內容,結果為:

2.事件

mysql 5.1.6及更高版本有乙個事件排程器,它使我們可以把資料庫操作安排在預定時間執行。

事件是與乙個時間表相關聯的儲存程式,時間表用來定義事件發生的時間、次數以及何時消失。事件非常適合用來執行各種無人值守的系統管理任務,如定期更新彙總報告、清理過期失效的資料、對日誌資料表進行輪轉等。這裡主要演示如何對過期失效的資料行進行處理。

在預設的情況下,事件排程器不會執行。如果你想使用事件,必須先啟用事件排程器。把以下語句新增到乙個選項檔案中(伺服器在啟動時將讀取):

[

mysqld

]event_scheduler

=on

如果你想在系統執行時檢視事件排程器的狀態,可以使用這條語句:

show variables like

'event_scheduler

';

如果你想在系統執行時停止或啟動事件排程器,可以通過改變event_scheduler系統變數的值來達到目的(它是乙個glorat變數,你必須擁有super許可權才能修改它):

set global event scheduler =

off; #or

0set global event scheduler =

on; #or

1

如果你停止了事件排程器,就沒有事件可以執行了。你也可以讓事件排程器保持執行,但禁用各事件稍後將討論(disabled)。

說明:如果你在啟動伺服器時把event_scheduler變數設里為disabled,在系統執行時,你將只能檢視它的狀態,不能改變它的狀態。在此基礎上,你仍可以建立事件,但它們將不能執行(所有事件disabled)。

事件排程器將把它的執**況寫到伺服器的「錯誤」日誌裡,你可以從這個日誌查到關於事件排程器正在幹什麼的資訊。它會把它執行的每乙個事件以及在事件執行過程中發生的錯誤記載到日誌裡。如果你認為事件排程器應該正在執行、可它實際上並沒有執行,請到「錯誤」日誌裡找找原因。

下面的例子演示了如何建立乙個簡單的事件來刪除資料表裡「老」資料行。假設你有乙個名為web_session的資料表,其內容是訪問你**的使用者的會話狀態資訊。這個資料表有乙個名為last_visit的datetime資料列,記錄著每位使用者最近一次的訪問時間。如果不想讓這個資料表裡的老資料行越積越多,就建立乙個事件來定期清理它們。若要讓這個事件每隔4小時執行一次,就把超過一天的資料行清除掉。下面是相應的事件定義:

create

event expire_web_session

on schedule every 4

hour

dodelete

from web_session where last_visit

day;

every n interval子句用來給出事件定期執行的時間間隔。interval值近似於date_add()函式裡的引數值,它可以是hour、day或month。在every子句的後面,你還可以用starts datetime和ends datetime選項給出事件第一次和最後一次執行的時間。在預設情況下,every事件將在它被建立後立刻開始它的第一次執行,並將一直定期執行下去,沒有「最後一次」的說法。

do子句負責定義事件的語句體部分,也就是將在事件被觸發時執行的sql語句。和其他型別的儲存程式一樣,這可以是一條簡單的語句,也可以是一條以begin開始、以end結束的復合語句。

如果想建立乙個只執行一次的事件,就應該使用at排程型別而不是every。如下所示的定義將建立乙個只執行一次的事件,在乙個小時後執行:

create

event one_ shot

on schedule at current_timestamp

+interval 1

hour

do ...;

如果你想禁用某個事件,讓它不再定期執行,或者重新啟用某個已被禁用的事件,請使用alter event語句:

alter

event event_name disable;

alter event event_name enable;

每個事件都隸屬於某個資料庫,所以你必須擁有那個資料庫的event許可權才能為它建立或刪除事件。

2 mysql(索引 儲存引擎)

課程大綱 1 在功能上的分類 聚簇索引 建表時,指定了主鍵列,mysql innodb 會將主鍵作為聚簇索引列 如果沒有主鍵,會選擇唯一鍵作為聚集索引。輔助索引 1 單列輔助索引 2 聯合索引 多個列作為索引條件,生成索引樹,理論上設計的好的,可以減少大量的回表查詢 注 聯合索引注意最左原則,inx...

資料儲存知識 2 Mysql檢視執行計畫

explain select 變體 1.explain extended select 將執行計畫 反編譯 成select語句,執行show warnings 可得到被mysql優化器優化後的查詢語句 2.explain partitions select 用於分割槽表的explain 執行計畫包含...

MySQL解析(2) MySQL版本

mysql ab目前維護的mysql版本主要包括 mysql 4.1 mysql 5.0 mysql 5.1 mysql 6.0 其中處於stable狀態的有mysql4.1 5.0,而mysql5.1處於rc beta 版,mysql 6.0 處於 alpha版。mysql 5.0是stable的...