MySQL 触发器 存储过程 一点小用
同事离职,又一个一个烂摊子要收拾。这里修修,那里补补都没有精力来写点东西。
明天回家,上午整理好文档。下午决定抽点时间,把最近的东西尽量理一理。很多灵感都已经遗忘。我们总在不断面对,所以我们不断遗忘。【syslog、mysql优化、触发器、存储过程、文件读写……】疯狂的Google着这些关键词,以求在对项目整体改动最小、影响最小情况下完成这些工作。
过程很痛苦,今天这篇算是痛定思痛吧!
在技术可行的情况下,优雅的设计永远很重要,否则就不断痛苦吧。(思考,成熟的思考一定在行动之前)
言归正传:触发器、存储过程可以理解一些预先编写好的函数,存储在数据库服务器上。触发器关联到具体表,对一张数据表进行插入、更新、删除这三类操作前、操作后都可以做一些事情,比如:删除某张表一条记录后,可以同时删除一张相关表中的对应记录。而这些工作都会由数据库自动完成。
一个例子:
DELIMITER ;;
TRIGGER `targetTest` AFTER INSERT ON `tbl_1` FOR EACH ROW BEGIN
if not exists (select id from tbl_2 where name=NEW.name) then
INSERT INTO tbl_2 (`name`,`record`) VALUES (NEW.name,'1');
else
UPDATE tbl_2 SET record=record+1 WHERE name=NEW.name;
end if;
END */;;
DELIMITER ;
说明:上面例子实现功能,向表tbl_1中插入一条数据之后,判断tbl_2中有没有此记录,如果没有插入一条新的记录到tbl_2,如果有对应name则更新一下tbl_2的record字段。(触发器语法解释可以Google其他资料)
存储过程,一段编写好的SQL语句可以封装成函数,直接调用:
一个例子:
DELIMITER $$
CREATE DEFINER=`xxx`@`localhost` PROCEDURE `pro_test`(e_table varchar(1000),e_filename varchar(1000),e_condition varchar(1000))
begin
SET @sql = CONCAT('select * into outfile "',e_filename, '" from ',e_table);
IF e_condition IS NOT NULL AND e_condition <> '' THEN
SET @sql = CONCAT(@sql,' where ',e_condition);
END IF;
PREPARE record from @sql;
EXECUTE record;
DEALLOCATE PR
相关文档:
在命令行上使用选项
在命令行中指定的程序选项遵从下述规则:
· 在命令名后面紧跟选项。
· 选项参量以一个和两个破折号开始,取决于它具有短名还是长名。许多选项有两种形式。例如,-?和--help是 ......
登录mysql slave服务器,执行show slave status命令,一般显示以下参数的状态;
Slave_IO_State: Waiting for master to send event
Master_Host:192.168.0.1
Master_User:repl_user
Master_Port:3306
Connect_Retry:60
Master_Log_File:mysql-bin.000010
Read_Master_Log_Pos:2562541
Relay_Log_File:mysql-r ......
问题描述:
从php界面insert数据到mysql,只能输入偶数个汉字不能输入奇数个汉字,输入奇数个汉字后报“Data too long for column ”错误,并没有更改数据库数据。到数据库查看,发现汉字都是乱码。但是php界面显示汉字正常(当然显示的都是偶数个汉字,奇数个汉字都没有写入数据库)。
解决思路:
1.更改my.i ......
15.2.6.5. InnoDB和MySQL复制
MySQL复制就像对MyISAM表一样,也对InnoDB表起作用。以某种方式使用复制也是可能的,在这种方式中从服务器上表的类型不同于主服务器上原始表的类型。例如,你可以复制修改到主服务器上一个InnoDB表,到从服务器上一个MyISAM表里。
要为一个主服务器建立一个新服务器,你不得不复制In ......