Mysql 存储过程 与触发器

阅读更多
两天前同事的一个日志模块事件备份老是报内存溢出错误,正好有点时间研究了一下。日志的备份时查询所有的记录,写到一个文件了。(虽然从实用的角度,数据库备份有很多中非常有效方法,请先不要鄙视这种做法:尊重真理一样尊重需求才是一个好的工程师)
Mysql触发器:
当对表格进行某张表格进行插入、更新、删除的之前、之后对数据库进行一些操作,比如:添加用户的时候记录插入一条日志记录到日志表。

Mysql存储过程:
存储过程是一段复杂的SQL语句,可以包装成函数的形式,让后代码中只要回调这个函数就行,可以实现分页、数据备份什么的。

这里只是一个简单的笔记,相关的资料网上很多,建议边用边查。
select *  into outfile "d:\\Windows.txt" from t_windows;


LOAD DATA INFILE "d:\\Windows.txt" INTO TABLE t_windows;


完整的分页存储过程:
CREATE PROCEDURE p_pageList ( 
	  m_pageNo int , //页数
	  m_perPageCnt int , //每页的记录数
	  m_column varchar(1000) , //查询的字段
	  m_table varchar(1000) , //要分页的表
	  m_condition varchar(1000), //分页条件
	  m_orderBy varchar(200) , //分组
	  out m_totalPageCnt int //总记录数
  ) 
  BEGIN 
	  SET @pageCnt = 1; // 总记录数 
	  SET @limitStart = (m_pageNo - 1)*m_perPageCnt; //起始记录数
	  SET @limitEnd = m_perPageCnt; //每页记录数
	  SET @sqlCnt = CONCAT('select count(1) into @pageCnt from ',m_table); // concat 字符串函数,这条语句很关键,用来得到总数值 
	  SET @sql = CONCAT('select ',m_column,' from ',m_table); //查询的字段

	  IF m_condition IS NOT NULL AND m_condition <> '' THEN 
		  SET @sql = CONCAT(@sql,' where ',m_condition); 
		  SET @sqlCnt = CONCAT(@sqlCnt,' where ',m_condition); 
	  END IF; 

	  IF m_orderBy IS NOT NULL AND m_orderBy <> '' THEN 
	  	SET @sql = CONCAT(@sql,' order by ',m_orderBy); 
	  END IF; 

	  SET @sql = CONCAT(@sql, ' limit ', @limitStart, ',', @limitEnd); //查询语句

	  PREPARE s_cnt from @sqlCnt; //预定义语句
	  EXECUTE s_cnt; //执行
	  DEALLOCATE PREPARE s_cnt; //释放资源

	  SET m_totalPageCnt = @pageCnt; //总记录数

	  PREPARE record from @sql; 
	  EXECUTE record; 
	  DEALLOCATE PREPARE record; 

  END

每个人的需求不同,不要指望拷贝下去就可以使用,仿照格式套路自己多调式调式。

你可能感兴趣的:(MySQL,SQL,Windows)