欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL存儲(chǔ)函數(shù)以及觸發(fā)器詳解

 更新時(shí)間:2023年06月25日 10:01:37   作者:小劉在C站  
這篇文章詳細(xì)給大家介紹了MySQL-SQL存儲(chǔ)函數(shù)以及觸發(fā)器,文中有詳細(xì)的代碼示例,對(duì)我們學(xué)習(xí)MySQL有一定的幫助,感興趣的朋友可以參考閱讀下

MySQL

MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),由瑞典MySQL AB 公司開(kāi)發(fā),屬于 Oracle 旗下產(chǎn)品。MySQL 是最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)之一,在 WEB 應(yīng)用方面,MySQL是最好的 RDBMS (Relational Database Management System,關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)) 應(yīng)用軟件之一。MySQL是一種關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),關(guān)系數(shù)據(jù)庫(kù)將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個(gè)大倉(cāng)庫(kù)內(nèi),這樣就增加了速度并提高了靈活性。MySQL所使用的 SQL 語(yǔ)言是用于訪問(wèn)數(shù)據(jù)庫(kù)的最常用標(biāo)準(zhǔn)化語(yǔ)言。MySQL 軟件采用了雙授權(quán)政策,分為社區(qū)版和商業(yè)版,由于其體積小、速度快、總體擁有成本低,尤其是開(kāi)放源碼這一特點(diǎn),一般中小型和大型網(wǎng)站的開(kāi)發(fā)都選擇 MySQL 作為網(wǎng)站數(shù)據(jù)庫(kù)。

SQL

結(jié)構(gòu)化查詢語(yǔ)言(Structured Query Language)簡(jiǎn)稱SQL,是一種特殊目的的編程語(yǔ)言,是一種數(shù)據(jù)庫(kù)查詢和程序設(shè)計(jì)語(yǔ)言,用于存取數(shù)據(jù)以及查詢、更新和管理關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)。結(jié)構(gòu)化查詢語(yǔ)言是高級(jí)的非過(guò)程化編程語(yǔ)言,允許用戶在高層數(shù)據(jù)結(jié)構(gòu)上工作。它不要求用戶指定對(duì)數(shù)據(jù)的存放方法,也不需要用戶了解具體的數(shù)據(jù)存放方式,所以具有完全不同底層結(jié)構(gòu)的不同數(shù)據(jù)庫(kù)系統(tǒng), 可以使用相同的結(jié)構(gòu)化查詢語(yǔ)言作為數(shù)據(jù)輸入與管理的接口。結(jié)構(gòu)化查詢語(yǔ)言語(yǔ)句可以嵌套,這使它具有極大的靈活性和強(qiáng)大的功能。

存儲(chǔ)函數(shù)

1). 介紹

存儲(chǔ)函數(shù)是有返回值的存儲(chǔ)過(guò)程,存儲(chǔ)函數(shù)的參數(shù)只能是 IN 類型的。具體語(yǔ)法如下:

CREATE FUNCTION 存儲(chǔ)函數(shù)名稱 ([ 參數(shù)列表 ])
RETURNS type [characteristic ...]
BEGIN
-- SQL語(yǔ)句
RETURN ...;
END ; 

characteristic 說(shuō)明

DETERMINISTIC :相同的輸入?yún)?shù)總是產(chǎn)生相同的結(jié)果

NO SQL :不包含 SQL 語(yǔ)句。

READS SQL DATA :包含讀取數(shù)據(jù)的語(yǔ)句,但不包含寫(xiě)入數(shù)據(jù)的語(yǔ)句。

2). 案例

計(jì)算從 1 累加到 n 的值, n 為傳入的參數(shù)值。

create function fun1(n int)
returns int deterministic
begin
declare total int default 0;
while n>0 do
set total := total + n;
set n := n - 1;
end while;
return total;
end;
select fun1(50);

在 mysql8.0 版本中 binlog 默認(rèn)是開(kāi)啟的,一旦開(kāi)啟了, mysql 就要求在定義存儲(chǔ)過(guò)程時(shí),需要指定
characteristic 特性,否則就會(huì)報(bào)如下錯(cuò)誤:

 觸發(fā)器

介紹

觸發(fā)器是與表有關(guān)的數(shù)據(jù)庫(kù)對(duì)象,指在 insert/update/delete 之前 (BEFORE) 或之后 (AFTER) ,觸發(fā)并執(zhí)行觸發(fā)器中定義的 SQL 語(yǔ)句集合。觸發(fā)器的這種特性可以協(xié)助應(yīng)用在數(shù)據(jù)庫(kù)端確保數(shù)據(jù)的完整性, 日志記錄 , 數(shù)據(jù)校驗(yàn)等操作 。

使用別名 OLD 和 NEW 來(lái)引用觸發(fā)器中發(fā)生變化的記錄內(nèi)容,這與其他的數(shù)據(jù)庫(kù)是相似的。現(xiàn)在觸發(fā)器還只支持行級(jí)觸發(fā),不支持語(yǔ)句級(jí)觸發(fā)。

 語(yǔ)法

1). 創(chuàng)建

CREATE TRIGGER trigger_name
BEFORE/AFTER INSERT/UPDATE/DELETE
ON tbl_name FOR EACH ROW -- 行級(jí)觸發(fā)器
BEGIN
trigger_stmt ;
END; 

2). 查看

SHOW TRIGGERS ;

3). 刪除

DROP TRIGGER [schema_name.]trigger_name ; -- 如果沒(méi)有指定 schema_name,默認(rèn)為當(dāng)前數(shù)
據(jù)庫(kù) 。

案例

通過(guò)觸發(fā)器記錄 tb_user 表的數(shù)據(jù)變更日志,將變更日志插入到日志表 user_logs 中 , 包含增加 ,

修改 , 刪除 ;

表結(jié)構(gòu)準(zhǔn)備 :

-- 準(zhǔn)備工作 : 日志表 user_logs
create table user_logs(
id int(11) not null auto_increment,
operation varchar(20) not null comment '操作類型, insert/update/delete',
operate_time datetime not null comment '操作時(shí)間',
operate_id int(11) not null comment '操作的ID',
operate_params varchar(500) comment '操作參數(shù)',
primary key(`id`)
)engine=innodb default charset=utf8;

A. 插入數(shù)據(jù)觸發(fā)器

create trigger tb_user_insert_trigger
after insert on tb_user for each row
begin
insert into user_logs(id, operation, operate_time, operate_id, operate_params)
VALUES
(null, 'insert', now(), new.id, concat('插入的數(shù)據(jù)內(nèi)容為:
id=',new.id,',name=',new.name, ', phone=', NEW.phone, ', email=', NEW.email, ',
profession=', NEW.profession));
end;

測(cè)試:

-- 查看
show triggers ;
-- 插入數(shù)據(jù)到tb_user
insert into tb_user(id, name, phone, email, profession, age, gender, status,
createtime) VALUES (26,'三皇子','18809091212','erhuangzi@163.com','軟件工
程',23,'1','1',now());

測(cè)試完畢之后,檢查日志表中的數(shù)據(jù)是否可以正常插入,以及插入數(shù)據(jù)的正確性。

B. 修改數(shù)據(jù)觸發(fā)器

create trigger tb_user_update_trigger
after update on tb_user for each row
begin
insert into user_logs(id, operation, operate_time, operate_id, operate_params)
VALUES
(null, 'update', now(), new.id,
concat('更新之前的數(shù)據(jù): id=',old.id,',name=',old.name, ', phone=',
old.phone, ', email=', old.email, ', profession=', old.profession,
' | 更新之后的數(shù)據(jù): id=',new.id,',name=',new.name, ', phone=',
NEW.phone, ', email=', NEW.email, ', profession=', NEW.profession));
end;

測(cè)試:

-- 查看
show triggers ;
-- 更新
update tb_user set profession = '會(huì)計(jì)' where id = 23;
update tb_user set profession = '會(huì)計(jì)' where id <= 5;

測(cè)試完畢之后,檢查日志表中的數(shù)據(jù)是否可以正常插入,以及插入數(shù)據(jù)的正確性。

C. 刪除數(shù)據(jù)觸發(fā)器

create trigger tb_user_delete_trigger
after delete on tb_user for each row
begin
insert into user_logs(id, operation, operate_time, operate_id, operate_params)
VALUES
(null, 'delete', now(), old.id,
concat('刪除之前的數(shù)據(jù): id=',old.id,',name=',old.name, ', phone=',
old.phone, ', email=', old.email, ', profession=', old.profession));
end;

測(cè)試:

-- 查看
show triggers ;
-- 刪除數(shù)據(jù)
delete from tb_user where id = 26; 

測(cè)試完畢之后,檢查日志表中的數(shù)據(jù)是否可以正常插入,以及插入數(shù)據(jù)的正確性。

到此這篇關(guān)于MySQL存儲(chǔ)函數(shù)以及觸發(fā)器詳解的文章就介紹到這了,更多相關(guān)MySQL存儲(chǔ)函數(shù)及觸發(fā)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL中復(fù)制數(shù)據(jù)表中的數(shù)據(jù)到新表中的操作教程

    MySQL中復(fù)制數(shù)據(jù)表中的數(shù)據(jù)到新表中的操作教程

    這篇文章主要介紹了MySQL中復(fù)制數(shù)據(jù)表中的數(shù)據(jù)到新表中的操作教程,文中分為新表存在和新表不存在兩種情況來(lái)講,需要的朋友可以參考下
    2016-03-03
  • mysql5.7.18.zip免安裝版本配置教程(windows)

    mysql5.7.18.zip免安裝版本配置教程(windows)

    這篇文章主要為大家詳細(xì)介紹了mysql5.7.18.zip安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • MySQL8.0高可用MIC的實(shí)現(xiàn)

    MySQL8.0高可用MIC的實(shí)現(xiàn)

    本文介紹了如何實(shí)現(xiàn)MySQL8.0高可用MIC,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10
  • 高級(jí)MySQL數(shù)據(jù)庫(kù)面試問(wèn)題 附答案

    高級(jí)MySQL數(shù)據(jù)庫(kù)面試問(wèn)題 附答案

    絕對(duì)精彩的文章,11個(gè)高級(jí)MySQL數(shù)據(jù)庫(kù)面試問(wèn)題,每個(gè)問(wèn)題都給出了具體答案,感興趣的小伙伴們可以參考一下
    2016-07-07
  • 一次Mysql死鎖排查過(guò)程的全紀(jì)錄

    一次Mysql死鎖排查過(guò)程的全紀(jì)錄

    在測(cè)試環(huán)境測(cè)試給用戶并發(fā)發(fā)送卡券時(shí),出現(xiàn)了死鎖,通過(guò)查找相關(guān)的資料解決了這個(gè),所以想著總結(jié)出來(lái),所以下面這篇文章主要是關(guān)于一次Mysql死鎖排查過(guò)程的全紀(jì)錄,需要的朋友可以參考下,希望大家從中能有所幫助。
    2017-02-02
  • Mysql字符串字段判斷是否包含某個(gè)字符串的2種方法

    Mysql字符串字段判斷是否包含某個(gè)字符串的2種方法

    這篇文章主要介紹了Mysql字符串字段判斷是否包含某個(gè)字符串的2種方法,本文使用Like和find_in_set兩種方法實(shí)現(xiàn),需要的朋友可以參考下
    2015-01-01
  • MySQL深分頁(yè),limit 100000,10優(yōu)化方式

    MySQL深分頁(yè),limit 100000,10優(yōu)化方式

    MySQL中深分頁(yè)查詢因需掃描大量數(shù)據(jù)行導(dǎo)致效率低下,優(yōu)化方法包括子查詢優(yōu)化、延遲關(guān)聯(lián)、標(biāo)簽記錄法和使用between...and...等,通過(guò)減少回表次數(shù)和范圍掃描提升查詢性能,覆蓋索引幫助減少搜索次數(shù),提升性能
    2024-10-10
  • MySQL 日期時(shí)間格式化函數(shù) DATE_FORMAT() 的使用示例詳解

    MySQL 日期時(shí)間格式化函數(shù) DATE_FORMAT() 的使用示例詳解

    `DATE_FORMAT()`是MySQL中用于格式化日期時(shí)間的函數(shù),本文詳細(xì)介紹了其語(yǔ)法、格式化字符串的含義以及常見(jiàn)日期時(shí)間格式組合,感興趣的朋友一起看看吧
    2025-03-03
  • MySQL collation方法

    MySQL collation方法

    在以前用oracle的時(shí)候,很少關(guān)于它的collation方法,但是在mysql中,這點(diǎn)不加注意的話,卻有可能會(huì)出現(xiàn)問(wèn)題。
    2008-10-10
  • Mysql表,列,庫(kù)增刪改查問(wèn)題小結(jié)

    Mysql表,列,庫(kù)增刪改查問(wèn)題小結(jié)

    下面是我總結(jié)的一些基礎(chǔ)的sql知識(shí),方便以后使用,需要的朋友參考可以參考下
    2017-07-07

最新評(píng)論