mysql 觸發(fā)器學(xué)習(xí)

1. 一個(gè)簡(jiǎn)單的例子

1.1. 創(chuàng)建表:

create table t(s1 integer);

1.2. 觸發(fā)器:

delimiter |

createtriggert_trigger beforeinsertontforeach row

beginset@x ="hello trigger";

setNEW.s1 = 55;

end;

|

1.3. 如果觸發(fā)器創(chuàng)建錯(cuò)誤,可能只能刪除了,至少我試過(guò)不能replace

drop trigger t_trigger;

1.4. 當(dāng)執(zhí)行insert 時(shí):

insert into t values(1);

1.5. 會(huì)執(zhí)行觸發(fā)器t_trigger

select @x,t.* from t;

1.6. 可以看到結(jié)果:

1.7可以使用?SHOW TRIGGERS; 查看新建的觸發(fā)器

2. url查詢(xún)哈希值的維護(hù) 觸發(fā)器

2.1 創(chuàng)建表 pseudohash。

2.2 創(chuàng)建觸發(fā)器,當(dāng)對(duì)表進(jìn)行插入和更新時(shí),觸發(fā) 觸發(fā)器

delimiter|

createtriggerpseudohash_crc_ins beforeinsertonpseudohashforeach row

beginset@x="hellotrigger";

setNEW.url_crc=crc32(NEW.url);

end;

|

createtriggerpseudohash_crc_upd beforeupdateonpseudohashforeach row

beginset@x="hellotrigger";

setNEW.url_crc=crc32(NEW.url);

end;

|

delimiter ;

2.3 插入操作

insert into pseudohash(url) values("http://www.baidu.com");

insert into pseudohash(url) values("http://www.163.com");

2.4 查看表中數(shù)據(jù)(是進(jìn)行更新操作之后的數(shù)據(jù))

2.5 更新

update pseudohash set url = 'www.163.com' where id = 1;

可以看到的是,插入和更新操作后,他們的 url_crc是不同的

----------------------------------------------------------------------------

2.6 ?上面源于一個(gè) 對(duì)于url建立索引的例子,還有一種建立索引的方式: 在B+ 樹(shù)上建立一個(gè)偽索引,和真正的索引不同,它還是在B+樹(shù) 索引上進(jìn)行查找,但是,使用的是 鍵的哈希值進(jìn)行查找,而不是鍵本身,這樣會(huì)加快查找

2.6.1 創(chuàng)建urls 表,注意使用的是 memory存儲(chǔ)引擎

CREATETABLE`urls` (

`url`varchar(255)DEFAULTNULL,

`url_crc`int(11)DEFAULT'0',

KEY`url` (`url`) USING HASH

) ENGINE=MEMORYDEFAULTCHARSET=utf8;

2.6.2 然后插入url和url_crc,例如

insert into urls values('www.gougou.com',crc32('www.gougou.com'));

像上面的那樣,或者使用觸發(fā)器

2.6.3 然后查詢(xún)的時(shí)候使用 hash索引查詢(xún)

select * from urls where url = "www.baidu.com" and url_crc = crc32("www.baidu.com");

select * from urls where url_crc = crc32("www.baidu.com");

select * from urls where url = "www.baidu.com"

上面3個(gè)查詢(xún)結(jié)果當(dāng)然是一樣的,但是速度上hash的快很多

3. 觸發(fā)器 語(yǔ)法

3.1CREATE TRIGGER trigger_name trigger_time trigger_event

ON tbl_name FOR EACH ROW trigger_stmt

trigger_time是觸發(fā)程序的動(dòng)作時(shí)間。它可以是BEFORE或AFTERtrigger_event指明了激活觸發(fā)程序的語(yǔ)句的類(lèi)型。trigger_event可以是下述值之一:

·? ? ? ? ? ? INSERT:將新行插入表時(shí)激活觸發(fā)程序,例如,通過(guò)INSERT、LOAD DATA和REPLACE語(yǔ)句。

·? ? ? ? ? ? UPDATE:更改某一行時(shí)激活觸發(fā)程序,例如,通過(guò)UPDATE語(yǔ)句。

·? ? ? ? ? ? DELETE:從表中刪除某一行時(shí)激活觸發(fā)程序,例如,通過(guò)DELETE和REPLACE語(yǔ)句。

3.2 可能遇到的問(wèn)題

如果你在觸發(fā)器里面對(duì)剛剛插入的數(shù)據(jù)進(jìn)行了 insert/update, 會(huì)造成循環(huán)的調(diào)用.

如:

create trigger test before update on test for each row update test set NEW.updateTime = NOW() where id=NEW.ID; END

應(yīng)該使用set:

create trigger test before update on test for each row set NEW.updateTime = NOW(); END

3.3 觸發(fā)器 與存儲(chǔ)過(guò)程

觸發(fā)程序不能調(diào)用將數(shù)據(jù)返回客戶(hù)端的存儲(chǔ)程序,也不能使用采用CALL語(yǔ)句的動(dòng)態(tài)SQL

(允許存儲(chǔ)程序通過(guò)參數(shù)將數(shù)據(jù)返回觸發(fā)程序)。

而存儲(chǔ)過(guò)程 ?可以接受參數(shù),將結(jié)果范圍給應(yīng)用程序

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評(píng)論 19 139
  • 觸發(fā)器概念 什么是觸發(fā)器 觸發(fā)器是一種與表操作有關(guān)的數(shù)據(jù)庫(kù)對(duì)象,當(dāng)觸發(fā)器所在表上發(fā)生指定事件時(shí),將調(diào)用該對(duì)象,即表...
    maxwellyue閱讀 1,290評(píng)論 0 11
  • 觸發(fā)器 MySQL包含對(duì)觸發(fā)器的支持。觸發(fā)器是一種與表操作有關(guān)的數(shù)據(jù)庫(kù)對(duì)象,當(dāng)觸發(fā)器所在表上出現(xiàn)指定事件時(shí),將調(diào)用...
    FTOLsXD閱讀 1,046評(píng)論 0 1
  • 沒(méi)啥可說(shuō),就是個(gè)習(xí)慣。寫(xiě)一兩筆,那是感冒了,嗓子巨疼,多保重,多喝水
    白濱閱讀 92評(píng)論 0 0
  • 1 spring核心AOP spring aop 實(shí)現(xiàn)方式,網(wǎng)上看到大神的示例,非常的清晰,鏈接如下,總共4篇: ...
    我不是李小龍閱讀 400評(píng)論 0 1

友情鏈接更多精彩內(nèi)容