濮阳杆衣贸易有限公司

主頁 > 知識庫 > MySQL通過觸發(fā)器解決數(shù)據(jù)庫中表的行數(shù)限制詳解及實(shí)例

MySQL通過觸發(fā)器解決數(shù)據(jù)庫中表的行數(shù)限制詳解及實(shí)例

熱門標(biāo)簽:電銷機(jī)器人公眾號推送 昆明智能外呼系統(tǒng)中心 長安區(qū)違法建房地圖標(biāo)注 電銷機(jī)器人說明書 智能電銷機(jī)器人靠譜么 南宋地圖標(biāo)注黃河華山 安國在哪里辦理400電話 手機(jī)用地圖標(biāo)注工具 地圖標(biāo)注培訓(xùn)

MySQL通過觸發(fā)器解決數(shù)據(jù)庫中表的行數(shù)限制詳解及實(shí)例

最近項(xiàng)目一個(gè)需求是對操作日志的數(shù)量限制為10萬條,超過十萬條便刪除最舊的那一條,保存數(shù)據(jù)庫中日志數(shù)量不超過10萬。
當(dāng)時(shí)我的第一想法是通過觸發(fā)器來做,便在數(shù)據(jù)庫中執(zhí)行了如下的SQL:

delimiter $
create trigger limitLog
before
insert
on OperationLog
for each row
begin
if (select count(*) from OperationLog) > 100000 then
delete from OperationLog limit 1;
end if;
end $

delimiter ;

看起來似乎沒什么問題,對于insert前執(zhí)行判斷,如果數(shù)量超過100000就執(zhí)行刪除。但在真正數(shù)據(jù)庫超過100000條,也就是開始執(zhí)行IF語句的時(shí)候就出問題,MySQL報(bào)錯(cuò):

ERROR 1442 (HY000): Can't update table 'OperationLog' in stored 
function/trigger because it is already used by statement which invoked 
this stored function/trigger.

查閱資料才知道,MySQL為了防止觸發(fā)器遞歸死循環(huán)的執(zhí)行,不允許在某張表的觸發(fā)器中直接對該表進(jìn)行DML(SELECT,DELETE,UPDATE,INSERT)操作,當(dāng)然可以對其他表進(jìn)行這樣操作。

觸發(fā)器限制的是執(zhí)行對該表的DML操作。觸發(fā)器可以在你的執(zhí)行前后來修改要執(zhí)行的這一行數(shù)據(jù),通過set關(guān)鍵字。

delimiter $
create trigger setLog
before
insert
on OperationLog
for each row
begin
set NEW.action = 'test';
end $

delimiter ;

上述語句表示在insert OpetationLog表的之前,更新insert這條數(shù)據(jù)的action字段值為test,NEW就表示新添加的這條字段,同樣的OLD就表示delete時(shí)的字段。而在update的時(shí)候NEW以及OLD同時(shí)都可以使用。

臨時(shí)觸發(fā)器

剛剛談到的觸發(fā)器(Triggers)是基于某個(gè)表所產(chǎn)生的事件觸發(fā)的,而臨時(shí)觸發(fā)器也稱為事件調(diào)度器是基于特定時(shí)間周期觸發(fā)來執(zhí)行某些任務(wù)。MySQL的事件調(diào)度器可以精確到每秒鐘執(zhí)行一個(gè)任務(wù),而操作系統(tǒng)的計(jì)劃任務(wù)(如:Linux下的CRON或Windows下的任務(wù)計(jì)劃)只能精 確到每分鐘執(zhí)行一次。對于一些對數(shù)據(jù)實(shí)時(shí)性要求比較高的應(yīng)用(例如:股票、賠率、比分等)就非常適合。

在使用這個(gè)功能之前必須確保event_scheduler已開啟,可執(zhí)行

 GLOBAL event_scheduler = 1;

或者

SET GLOBAL event_scheduler = ON;

要查看當(dāng)前是否已開啟事件調(diào)度器,可執(zhí)行如下SQL:

SHOW VARIABLES LIKE 'event_scheduler';

SELECT @@event_scheduler;


SHOW PROCESSLIST;

而對于本文一開始提到的問題,使用這種機(jī)制則可完美解決:

delimiter $
CREATE EVENT limitLog ON SCHEDULE EVERY 1 SECOND DO IF (select count(*) from OperationLog) > 100000 then delete from OperationLog limit 1;END IF $
 delimiter ;

親測有效

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

您可能感興趣的文章:
  • mysql實(shí)現(xiàn)查詢最接近的記錄數(shù)據(jù)示例
  • 詳解MySQL恢復(fù)psc文件記錄數(shù)為0的解決方案
  • PHP+MySQL統(tǒng)計(jì)該庫中每個(gè)表的記錄數(shù)并按遞減順序排列的方法
  • MySQL數(shù)據(jù)庫查看數(shù)據(jù)表占用空間大小和記錄數(shù)的方法
  • MYSQL速度慢的問題 記錄數(shù)據(jù)庫語句
  • MySQL分區(qū)表的局限和限制詳解
  • MySQL 如何限制一張表的記錄數(shù)

標(biāo)簽:東莞 吉安 長沙 潛江 江門 合肥 南昌 武漢

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL通過觸發(fā)器解決數(shù)據(jù)庫中表的行數(shù)限制詳解及實(shí)例》,本文關(guān)鍵詞  MySQL,通過,觸發(fā)器,解決,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MySQL通過觸發(fā)器解決數(shù)據(jù)庫中表的行數(shù)限制詳解及實(shí)例》相關(guān)的同類信息!
  • 本頁收集關(guān)于MySQL通過觸發(fā)器解決數(shù)據(jù)庫中表的行數(shù)限制詳解及實(shí)例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    漠河县| 凤山市| 东丽区| 和林格尔县| 丰城市| 常熟市| 阿勒泰市| 商河县| 阿鲁科尔沁旗| 菏泽市| 榆社县| 额敏县| 万载县| 巴彦县| 剑阁县| 黑山县| 灌阳县| 阿坝| 泸州市| 长治市| 舒兰市| 太原市| 长宁区| 安达市| 永吉县| 石林| 罗定市| 龙游县| 大冶市| 连云港市| 霍林郭勒市| 鸡东县| 天峻县| 平安县| 阳信县| 柏乡县| 广河县| 龙江县| 禹州市| 罗定市| 什邡市|