MySQL触发器解决方案历程
最近,项目中用到mysql,由于数据量非常大,每天的数据量在百万级,考虑到mysql数据库处理性能以及数据属性,决定保存足够多的查询数据即可,距当前时间最久远的数据直接删除,无需进行备份。
头脑中冒出的第一个想法就是,能否利用mysql中的触发器,检查数据表大小,如果超过预设长度,则删除部分数据。
CREATE TRIGGER tg AFTER INSERT ON traffic_info
FOR EACH ROW BEGIN
...
DELETE from traffic_info WHERE time <= "..."
...
END;
执行后出现如下错误:
ERROR 1442 (HY000): Can't update table 'traffic_info' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
原来,目前MySQL触发器还不支持删除触发器所在的表的数据,ok,我原始的想法是每个数据表自己管理表大小,现在看来是行不通了。
第二个想法是干脆用存储过程得了,手动调用存储过程来更新所有表的大小,考虑到数据表很多,想协议个接受数据表名为参数的存储过程:
CREATE PROCEDURE P(IN table_name VARCHAR(50), IN max_count INT)
READS SQL DATA
BEGIN
...
SELECT COUNT(1) from table_name
...
END;
这种做法行不通,mysql会将“table_name”字符串作为表名,搜索后发现,需要用到mysql新特性prepare,不过需要注意的是,就算是利用prepare,还是无法直接传入数据表名,需要利用CONCAT事先连接查询字符串:
CREATE PROCEDURE P(IN table_name VARCHAR(50), IN max_count INT)
READS SQL DATA
BEGIN
...
SET @query_str = CONCAT("SELECT COUNT(1) from ", table_name);
PREPARE stmt from @query_str
EXECUTE stmt;
...
END;
总算是送了一口气,可是又发现,我需要在存储过程中动态获取PREPARE查询的返回结果,但是,目前mysql还无法做到这一点,真是让人失望,看来只能另觅它途了……
时间仓促,今是为记
相关文档:
unixODBC安装
这几天真是郁闷死了,基本每天都在编译安装QT和unixODBC,无奈总会出现些莫名其妙的错误。首先,我承认我Linux玩地不熟,但这些开源软件产商之间的兼容性也太差了吧。所以还是制定个标准比较好,大家都遵守一个约定。从这个意义来说,微软的垄断,还是有一定的好处的。
......
一. 设置步骤:1、右键点击我的电脑,选择属性(见图-1)
1、点击高级,在对话框的下部点击环境变量
3、在系统变量对话框中,点击新建进行设置.
变量名:JAVA_HOME
变量值:C:\Program Files\Java\jdk1.6.0_05(在此使用的是默认安装路径)
系统变量->编辑->变 ......
1. 数据库
切换数据库: use mydb
2. 事件
查看事件: show events
启动调度器: set global event_scheduer = 1;
查看是否启动: show variables like 'event_scheduler';
3. 备份
在administator中的backup中无法备份数据库的事件。需要手动将创建事件的脚本添加到sql备 ......
导出.sql文件
1.将数据库transfer_server_db导出到transfSRV.sql文件中:
mysqldump -u root -p transfer_server_db > /home/eric/transfSRV.sql
2.将数据库transfer_server_db中的device_info_table导出到table.sql文件中:
mysqldump -u root -p transfer_server_db devi ......
年初的时候一直在做一个网站MSSQL2000->MySQL5的迁移工作,因为采用了不同的程序系统,所以主要问题在数据的迁移。由于2个系统数据库结构差异非常大,不方便采取SQLSERVER里导入MYSQL的ODBC数据源的功能(也不推荐这么做,字段类型等不同点会搞死人的~),因此就在WINDOWS下自己写PHP脚本从SQLSERVER里读数据,然后按照 ......