mysql資料庫觸發器全部課程,mysql資料庫觸發器創建與管理

本文目錄一覽:

怎樣使用Mysql新建觸發器

使用Mysql新建觸發器的方法:

1、首先,需要確定自己的Mysql資料庫的版本,因為my sql資料庫是從5.0.2版本才開始支持觸發器的。

2、在電腦的dos命令界面中輸入 mysql –version,來獲取mysql的版本號,注意version的兩個橫線和之前的mysql是有一個空格的。

3、上一步獲取了mysql版本號,就開始建立觸發器。採用以視圖加代碼的方式創建,在數據表中找到要執行刪除操作的表,然後右鍵設計表

4、這樣就打開了表的設計頁面,可以看到有一個觸發器選項卡,點擊「觸發器」

5、可以看到對應的選項,在名裡面添加需要新建的觸發器的名字,在觸發選項中選擇before或者after,然後在插入、更新、刪除三個選項中勾選一個。

6、這樣們就建立了一個名為「datri」的觸發器,在刪除操作執行之後觸發

7、然後在下面的定義下面的框中輸入需要執行的操作。然後點擊sql預覽,可以看到整個觸發器的代碼

8、最後就是保存了,由於做的是觸發器,保存之後,在執行刪除操作時,這個觸發器才相當於被執行。

mysql觸發器的作用

資料庫觸發器有下面的作用:

1.安全性。能夠基於資料庫的值使用戶具有操作資料庫的某種權利。

  # 能夠基於時間限制用戶的操作,比如不同意下班後和節假日改動資料庫數據。

2.審計。能夠跟蹤用戶對資料庫的操作。   

  # 審計用戶操作資料庫的語句。

  # 把用戶對資料庫的更新寫入審計表。

3.實現複雜的數據完整性規則

  # 實現非標準的數據完整性檢查和約束。觸發器可產生比規則更為複雜的限制。與規則不同,觸發器能夠引用列或資料庫對象。比如,觸發器可回退不論什麼企圖吃進超過自己保證金的期貨。

  # 提供可變的預設值。

4.實現複雜的非標準的資料庫相關完整性規則。觸發器能夠對資料庫中相關的表進行連環更新。比如,在auths表author_code列上的刪除觸發器可導致對應刪除在其他表中的與之匹配的行。

  # 在改動或刪除時級聯改動或刪除其他表中的與之匹配的行。

  # 在改動或刪除時把其他表中的與之匹配的行設成NULL值。

  # 在改動或刪除時把其他表中的與之匹配的行級聯設成預設值。

  # 觸發器可以拒絕或回退那些破壞相關完整性的變化,取消試圖進行數據更新的事務。當插入一個與其主健不匹配的外部鍵時,這樣的觸發器會起作用。比如,可以在books.author_code 列上生成一個插入觸發器,假設新值與auths.author_code列中的某值不匹配時,插入被回退。

5.同步實時地複製表中的數據。

6.自己主動計算數據值,假設數據的值達到了一定的要求,則進行特定的處理

mysql中的存儲過程、觸發器、視圖的用法

建立存儲過程

Create procedure、Create function

下面是它們的格式:

Create proceduresp_Name ([proc_parameter ])

routine_body

這裡的參數類型可以是 IN OUT INOUTT ,意思和單詞的意思是一樣的,IN 表示是傳進來的參數,

OUT 是表示傳出去的參數,INOUT 是表示傳進來但最終傳回的參數。

Create functionsp_Name ([func_parameter ])

Returns type

Routine_body

Returns type 指定了返回的類型,這裡給定的類型與返回值的類型要是一樣的,否則會報錯。

下面給出兩個簡單的例子來說明:

1、 顯示 Mysql 當前版本

執行結果

mysql use welefen;

Database changed

mysql delimiter // #定義//作為結束標記符號

mysql create procedure getversion(out param1 varchar(50)) #param1為傳出參數

– begin

– select version() into param1; #將版本的信息賦值給 param1

– end

– //

Query OK, 0 rows affected (0.00 sec)

mysql call getversion(@a); #調用getversion()這個存儲過程

– //

Query OK, 0 rows affected (0.00 sec)

mysql select @a;

– //

+————————–+

| @a |

+————————–+

| 5.1.14-beta-community-nt |

+————————–+

1 row in set (0.00 sec)

2、 顯示」hello world」

執行結果

mysql delimiter //

mysql create function display(w varchar(20)) returns varchar(50)

– begin

– return concat(‘hello 『,w);

– end

– //

Query OK, 0 rows affected (0.05 sec)

mysql select display(“world”);

– //

+——————+

| display(“world”) |

+——————+

| hello world |

+——————+

1 row in set (0.02 sec)

其他操作存儲過程的語句

前面我們已經知道了怎麼創建存儲過程,下面看看其他常用的用於操作存儲過程的語句。

Alter {procedure | function} sp_Name []

Alter 語法是用來改變一個過程或函數的特徵,當你想改變存儲過程或者函數的結構時可以使

用它。當然你也可以先 drop 它再 create。

Drop {procedure | function} [if exists] sp_Name

Drop 語法即用來刪除一個存儲程序或者函數,當你創建的一個存儲過程或者函數的名字已經存

在時,你想把以前的給覆蓋掉,那麼此時你就可以使用 drop ,然後在創建。

Show create {procedure | function } sp_Name

Show 語法用來顯示創建的存儲過程或者函數的信息。這裡的 show 用法跟數據表中的 show 用

法是很相似的。

Show {procedure | function} status [like ‘partten’]

它返回子程序的特徵,如資料庫,名字,類型,創建者及創建和修改日期。如果沒有指定樣式,

根據你使用的語句,所有存儲程序和存儲函數的信息都被列出。

看了以上的幾個語法,你是不是感覺跟對錶的操作很相象,那你就想對了,他們確實是很相似

的。帶著一份激動心情我們繼續往下看,你會發現很簡單。

Begin … End 語句

通過 begin end 可以來包含多個語句,每個語句以「;」結尾。

Declare

用Declare 來聲明局部變數

Declarevar_Name type defaulevaule

Delare 條件

Declarecondition_Name CONDITION FOR condition_value

調用存儲過程

Call

格式:

Callsp_Name [parameter ]

這裡的 sp_Name 必須是由 create procedure 創建的名稱。它可以通過聲明的參數來傳回值,

它也返回受影響的行數,在 MySQL 中可以通過 mysql_affected_rows() 來獲得。

流程式控制制語句

IF 語句

IFsearch_condition THENstatement_list

[ELSEIFsearch_condition THENstatement_list]

[ELSEstatement_list]

END IF

CASE 語句

CASE case_value

WHEN when_value THENstatement_list

WHEN when_value THENstatement_list]

ELSEstatement_list]

END CASE

LOOP 語句

[begin_label:] LOOP

statement_list

END LOOP [end_label]

LOOP 實現了一個簡單的循環,通過 LEAVE 來退出

LEAVE 語句

LEAVE lable

退出語句,一般可以用在循環中。

ITERATE 語句

ITERATE lable

ITERATE 一般出現在 LOOP、REPEATE、WHILE 里,意思是再次循環。

REPEATE 語句

[begin_label:] REPEAT

statement_list

UNTILsearch_condition

END REPEAT [end_label]

REPEAT 語句內的語句或語句群被重複,直至 search_condition 為真。

WHILE 語句

[begin_label:] WHILEsearch_condition DO

statement_list

END WHILE [end_label]

WHILE 語句內的語句或語句群被重複,直至 search_condition 為真。

運用實例

下面通過幾個例子來講述他們的應用:

對網站用戶的操作

為了簡單,用戶表只有用戶名和密碼的信息.在服務端,我們建立如下的表:

代碼片段

Drop table if exists user;

Create table user(

Id int unsigned not null auto_increment,

Name varchar(20) not null,

Pwd char(32) not null,

Primary key(Id)

);

添加用戶的存儲過程:

代碼片段

Delimiter //

Create procedure insertuser(in username varchar(20),in userpwd varchar(32))

Begin

Insert into welefen.user(Name,Pwd) values (username,md5(userpwd));

End

//

驗證用戶的存儲過程:

代碼片段

Delimiter //

Create procedure validateuser(in username varchar(20),out param1)

Begin

Select Pwd into param1 from welefen.user where Name=username;

End

//

修改密碼的存儲過程:

代碼片段

Delimiter //

Create procedure modifyPwd(in username varchar(20),in userpwd varchar(32))

Begin

Update welefen.user set Pwd=md5(userpwd) where Name=username;

End

//

刪除用戶的存儲過程:

代碼片段

Delimiter //

Create procedure deleteuser(in username varchar(20))

Begin

delete from welefen.user where Name=username;

End

//

在客戶端,我們給出如下的程序:

代碼片段

文件名:ProcedureUser.php

?php

if (!mysql_connect(“localhost”,”root”,”welefen”)){

echo “連接資料庫失敗”;

}

if (!mysql_select_db(“welefen”)){

echo “選擇資料庫表失敗br”;

}

$insert_user=array(“welefen”,”welefen”);//這裡的welefen分別為用戶名、密碼

if (mysql_query(“call insertuser(‘$insert_user[0]’,’$insert_user[1]’)”)){

echo “添加用戶$insert_user[0]成功br”;

}else {

echo “添加用戶$insert_user[0]失敗br”;

}

$validate_user=array(“welefen”,”welefen”);//這裡的welefen分別為用戶名、密碼

mysql_query(“call validateuser(‘$validate_user[0]’,@a)”);

$Pwd=mysql_query(“select @a”);

$result=mysql_fetch_array($Pwd);

if ($result[0]==md5($validate_user[1])){

echo “用戶$validate_user[0]驗證正確br”;

}else {

echo “用戶$validate_user[0]驗證錯誤br”;

}

$modify_Pwd=array(“welefen”,”weilefeng”); //welefen為用戶名weilefeng為新密碼

if (mysql_query(“call modifyPwd(‘$modify_Pwd[0]’,’$modify_Pwd[1]’)”)){

echo “用戶$modigy_Pwd[0]的密碼修改成功br”;

}else {

echo “用戶$modigy_Pwd[0]的密碼修改失敗br”;

}

$delete_user=array(“welefen”); //welefen為用戶名

if (mysql_query(“call deleteuser(‘$delete_user[0]’)”)){

echo “用戶$delete_user[0]刪除成功br”;

}else {

echo “用戶$delete_user[0]刪除失敗br”;

}

?

程序運行的結果:

執行結果

添加用戶welefen 成功

用戶welefen 驗證正確

用戶welefen 的密碼修改成功

用戶welefen 刪除成功

以上的這個程序簡單的說明了Mysql 中的存儲過程結合PHP 的應用,當然在實際應用要比這個

複雜的多。

驗證角谷猜想

角谷猜想:給定一個整數x,若x%2=1,則x=3*x+1,否則x=x/2,如此循環下去,經過有限步驟必

能得到1。

例 如 : 初 始 整 數 為 9 , 則

9-28-14-7-22-11-34-17-52-26-13-40-20-10-5-16-8-4-2-1

為了說明存儲過程中一些語法的應用,我們通過存儲過程來實現它:

執行結果

mysql delimiter //

mysql create procedure jgguess(in number int)

– begin

– declare param1 int default 1;

– set @a=concat(number);

– jiaogu:loop #循環開始

– set param1=number%2;

– if param1=1 then set number=number*3+1; #number 為奇數,將它乘3加 1

– else set number=number/2;

– end if;

– set @a=concat(@a,’-‘,number);

– if number1 then iterate jiaogu; #number 不為 1,繼續循環

– end if;

– leave jiaogu; #退出循環

– end loop jiaogu;

– end

– //

Query OK, 0 rows affected (0.00 sec)

mysql call jgguess(11);

– //

Query OK, 0 rows affected (0.00 sec)

mysql select @a//

+——————————————————-+

| @a |

+——————————————————-+

| 11-34-17-52-26-13-40-20-10-5-16-8-4-2-1 |

+——————————————————-+

1 row in set (0.02 sec)

在這個存儲過程中,你傳入的參數不能超過int 型數據的範圍,否則就會報錯。

觸發器

觸發器是與表有關的命名資料庫對象,當表上出現特定事件時,將激活該對象。例如當我們向

某個表插入一行數據時發生一個事件或者刪除某個記錄時觸發某個事件。

語法:

CREATE TRIGGER trigger_Name trigger_time trigger_event

ON tbl_Name FOR EACHROW trigger_stmt

trigger_time 是觸發器的動作時間。它可以是 BEFORE 或 AFTER ,以指明觸發器是在激活它的

語句之前或之後觸發。

trigger_event 指明了激活觸發器的語句的類型。trigger_event 可以是下述值之一:

INSERT:將新行插入表時激活觸發器,例如,通過 INSERT、LOADDATA 和 REPLACE 語句;

UPDATE:更改某一行時激活觸發器,例如,通過UPDATE語句;

DELETE:從表中刪除某一行時激活觸發器,例如,通過 DELETE 和 REPLACE 語句。

例如當我們向上面的user 表中增加一個用戶名為「welefen 」時,我們把記錄用戶數的表的值增

加 1;

代碼片段

Create table numuser(

Num int not null default 0

);

Delimiter //

Create trigger testnum after insert on welefen.user for each row

Begin

Update welefen.numuser set Num=Num+1;

End

//

視圖

當我們想得到數據表中某些欄位的信息,並想把他們保存時我們就可以用視圖。

語法:

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]

VIEW view_Name [(column_list)]

AS select_statement

[WITH [CASCADED | LOCAL] CHECK OPTION]

例如我們想對上面的用戶表使用視圖,可以這樣:

Create viewwelefen.userview as select * fromwelefen.user;

查看視圖的信息可以使用:

Select * fromwelfen.userview;

MYSQL觸發器使用

不需要用觸發器

create table Electricity

(

D_Id varchar(10),

MonthTotal float,

MonthUsed float,

MonthRemained as (MonthTotal-MonthUsed),

constraint f2 foreign key(D_Id) references Accounts(D_Id)

);

這樣就ok了。

constraint f2 foreign key(D_Id) references Accounts(D_Id)

你寫的這個是幹什麼用的,把這個去掉就沒有問題了

如何利用MySQL資料庫在插入數據後觸發觸發器

第一步,創建資料庫表t_class_info,利用創建表語句:

create table t_class_info(

id int(8),

t_no int(10),

t_name varchar(20),

t_addr varchar(60)

);

如下圖所示:

第二步,查看錶t_class_info描述,利用命令:

desc t_class_info;

如下圖所示:

第三步,創建觸發器info_tri,觸發時間是在向表t_class_info插入數據後,觸發事件是向表class_info中插入一條記錄,如下圖所示:

第四步,創建資料庫表class_info,利用命令:

create table class_info(

id int(8),

t_no int(10),

t_name varchar(20),

t_addr varchar(60)

);

如下圖所示:

第五步,查看class_info資料庫表結構,利用命令:

desc class_info;

如下圖所示:

6

第六步,查看資料庫表t_class_info和class_info數據,發現兩張沒有數據,這時調用插入語句,向資料庫表t_class_info里插入一條記錄,並查看資料庫表class_info是否新增記錄,如下圖所示:

MYsql資料庫中觸發器問題

Mysql的觸發器相當於內部處理的一些過程,不帶入和帶出任何的參數。

其內部使用的參數就是新舊兩條記錄old和new的欄位。

用於完成數據表之間的觸發操作,來保證資料庫的一致性、完整性。

Mysql的存儲過程是類似於其它編程語言中的函數的功能。

存儲過程內部可以使用順序循環和轉移三種基本程序結構,而且整個存儲過程可以接受和返回參數。

原創文章,作者:SRZT,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/144305.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
SRZT的頭像SRZT
上一篇 2024-10-24 15:28
下一篇 2024-10-25 13:51

相關推薦

  • Python 常用資料庫有哪些?

    在Python編程中,資料庫是不可或缺的一部分。隨著互聯網應用的不斷擴大,處理海量數據已成為一種趨勢。Python有許多成熟的資料庫管理系統,接下來我們將從多個方面介紹Python…

    編程 2025-04-29
  • openeuler安裝資料庫方案

    本文將介紹在openeuler操作系統中安裝資料庫的方案,並提供代碼示例。 一、安裝MariaDB 下面介紹如何在openeuler中安裝MariaDB。 1、更新軟體源 sudo…

    編程 2025-04-29
  • Python股票量化投資課程 百度網盤

    本文將從以下幾個方面對Python股票量化投資課程 百度網盤做詳細闡述。 一、量化投資的意義 量化投資是指利用數學模型和計算機技術,對市場進行數據挖掘、統計分析,採用科學的方法制定…

    編程 2025-04-29
  • 資料庫第三範式會有刪除插入異常

    如果沒有正確設計資料庫,第三範式可能導致刪除和插入異常。以下是詳細解釋: 一、什麼是第三範式和範式理論? 範式理論是關係資料庫中的一個規範化過程。第三範式是範式理論中的一種常見形式…

    編程 2025-04-29
  • 西瓜創客python課程:從入門到精通

    本文將對西瓜創客python課程進行詳細闡述。旨在為初學者提供一個從入門到精通的學習路徑,並為已經有一定基礎的人提供更深入的學習體驗。 一、為什麼選擇西瓜創客python課程 西瓜…

    編程 2025-04-28
  • leveldb和unqlite:兩個高性能的資料庫存儲引擎

    本文將介紹兩款高性能的資料庫存儲引擎:leveldb和unqlite,並從多個方面對它們進行詳細的闡述。 一、leveldb:輕量級的鍵值存儲引擎 1、leveldb概述: lev…

    編程 2025-04-28
  • Python怎麼導入資料庫

    Python是一種高級編程語言。它具有簡單、易讀的語法和廣泛的庫,讓它成為一個靈活和強大的工具。Python的資料庫連接類型可以多種多樣,其中包括MySQL、Oracle、Post…

    編程 2025-04-28
  • Think-ORM數據模型及資料庫核心操作

    本文主要介紹Think-ORM數據模型建立和資料庫核心操作。 一、模型定義 Think-ORM是一個開源的ORM框架,用於簡化在PHP應用中(特別是ThinkPHP)與關係資料庫之…

    編程 2025-04-27
  • 如何使用Python將CSV文件導入到資料庫

    CSV(Comma Separated Values)是一種可讀性高、易於編輯與導入導出的文件格式,常用於存儲表格數據。在數據處理過程中,我們有時需要將CSV文件導入到資料庫中進行…

    編程 2025-04-27
  • Python批量導入資料庫

    本文將介紹Python中如何批量導入資料庫。首先,對於數據分析和挖掘領域,資料庫中批量導入數據是一個必不可少的過程。這種高效的導入方式可以極大地提高數據挖掘、機器學習等任務的效率。…

    編程 2025-04-27

發表回復

登錄後才能評論