楼主: jinguanding

[原创] MySQL_DBA资料整理

[复制链接]
论坛徽章:
2
71#
发表于 2008-3-3 17:01 | 只看该作者
我顶

使用道具 举报

回复
论坛徽章:
52
2015年新春福章
日期:2015-03-06 11:57:312012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:32:552012新春纪念徽章
日期:2012-02-07 09:59:35
72#
 楼主| 发表于 2008-3-7 11:26 | 只看该作者

Merge引擎的简单测试

SQlyog工具:

CREATE TABLE eugene1 (  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,  username CHAR(20))engine=myisam;
CREATE TABLE eugene2 (  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,  username CHAR(20))engine=myisam;

INSERT INTO eugene1 (username) VALUES ('Testing merge1'),('eugene1');
INSERT INTO eugene2 (username) VALUES ('Testing merge2'),('eugene2');

CREATE TABLE total (id INT NOT NULL AUTO_INCREMENT,  username CHAR(20), INDEX(id))TYPE=MERGE UNION=(eugene1,eugene2) INSERT_METHOD=LAST;


select * from total ;

1        Testing merge1
2        eugene1
1        Testing merge2
2        eugene2


update total  set username=' merge1.2' where id=1;
select * from total ;

1         merge1.2
2        eugene1
1         merge1.2
2        eugene2

所以merge引擎的表是可以直接更新的

insert into total(username) values('username')
select * from total ;
1         merge1.2
2        eugene1
1         merge1.2
2        eugene2
3        username

select * from eugene1;

1         merge1.2
2        eugene1


select * from eugene2;

1         merge1.2
2        eugene2
3        username

因为定义total表的时候使用了:
INSERT_METHOD=LAST;

使用分表统计的时候,注意 auto_increment类型的字段,否则就出现上面出现的eugene1与eugene2中id字段值相同,
所以考虑使用到这个类型字段的时候,要注意考虑有多少个分表,然后规定每个分表的auto_increment取值不同就 可以..
若有 A与B分表,就可以规定A为负数,.减增长的方式从-1开始,B从1开始增长....根据有多少个表指定不同规则就可以实现的...

使用道具 举报

回复
论坛徽章:
52
2015年新春福章
日期:2015-03-06 11:57:312012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:32:552012新春纪念徽章
日期:2012-02-07 09:59:35
73#
 楼主| 发表于 2008-3-7 11:38 | 只看该作者
补充:
如果你没有指定INSERT_METHOD选项,或你用一个NO值指定该选项。往MERGE表插入记录会导致错误。

使用道具 举报

回复
论坛徽章:
52
2015年新春福章
日期:2015-03-06 11:57:312012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:32:552012新春纪念徽章
日期:2012-02-07 09:59:35
74#
 楼主| 发表于 2008-3-7 20:30 | 只看该作者

例外处理

为方便大家查找我之前写的例外处理东西贴到这个置顶的贴中。。。。。。。。


MySQL例外处理解说


关于MySQL的例外处理测试:

USE TEST;
                                                                                                                                                                        
CREATE TABLE `eugene` (
  `ID` int(11) NOT NULL,
  PRIMARY KEY  (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=gb2312;
                                                                                                                                                                        
delimiter $$
DROP PROCEDURE IF EXISTS `test`.`handlerdemo`$$
CREATE PROCEDURE handlerdemo ()
BEGIN  
        DECLARE X2 INT;
        DECLARE CONTINUE HANDLER FOR SQLWARNING       SET X2= 1;
        DECLARE CONTINUE HANDLER FOR NOT FOUND             SET X2 = 2;
        DECLARE CONTINUE HANDLER FOR SQLSTATE '23000'    SET X2= 3;
        DECLARE CONTINUE HANDLER FOR SQLEXCEPTION     SET X2 = 4;
        INSERT INTO  eugene  VALUES (1);
        INSERT INTO  eugene  VALUES (2);
        SELECT X2;
END;
$$
                                                                                                                                                                        
执行完上面的代码后,你可以反复执行:
CALL handlerdemo ()
看显示的结果是什么?
第一次运行,肯定为 NULL;
第二次运行,肯定为 3;
                                                                                                                                                               
然后再修改存储过程,把存储过程中的代码:DECLARE CONTINUE HANDLER FOR SQLSTATE '23000'    SET X2= 3;注释掉,在之前的基础上再次执行:
CALL handlerdemo ()
发现运行后的结果为 4;

剩下的SQLWARNING,NOT FOUND也类似,下面介绍下各自发挥的作用:
SQLWARNING是对所有以01开头的SQLSTATE代码的速记。(这个我自己的存储过程中还没用到过)
NOT FOUND是对所有以02开头的SQLSTATE代码的速记。(例如:游标产生的SQLSTATE=02000)
SQLEXCEPTION是对所有没有被SQLWARNING或NOT FOUND捕获的SQLSTATE代码的速记。(相当于Oracle中写例外处理的when ….else 中的else作用)。
SQLSTATE-----就是触发的错误代码编号,示例中的23000表示,当向eugene表中主键写入重复的值的时候,将会引发一个语法错误,错误编码就是23000,这个时候就会执行其后的语句:SET X2= 3。

官网上的语法:
DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement
                                                                                
handler_type:
    CONTINUE
  | EXIT
  | UNDO
                                                                                
condition_value:
    SQLSTATE [VALUE] sqlstate_value
  | condition_name
  | SQLWARNING
  | NOT FOUND
  | SQLEXCEPTION
  | mysql_error_code

[ 本帖最后由 jinguanding 于 2008-3-19 13:10 编辑 ]

使用道具 举报

回复
论坛徽章:
0
75#
发表于 2008-3-19 11:16 | 只看该作者

赞一个先

小弟现在正准备用这个数据库 看看资料先

使用道具 举报

回复
论坛徽章:
52
2015年新春福章
日期:2015-03-06 11:57:312012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:32:552012新春纪念徽章
日期:2012-02-07 09:59:35
76#
 楼主| 发表于 2008-3-26 09:54 | 只看该作者
关于Session变量与Declare变量...... Declare变量 简称为variable ; Session变量简称为 @variable


1. variable必须定义指定类型...而@variable不需要....注意decalre 子句还是有顺序的....

变量定义....游标定义....句柄声明

2. variable必须与BEGIN...END一起结合使用,作用范围出了BEGIN...END就自动销毁...

3.动态SQL中 不能使用variable,否则会提示没有定义....必须使用 @variable,例如:
SELECT accountid,account,discount INTO iaccountid,straccount,idiscount FROM history0803 WHERE cardsn=strtypesn;
若表名称是动态的:
SET @strSQL26=CONCAT('SELECT accountid,account,discount INTO iaccountid,straccount,idiscount FROM ',tablename,' WHERE cardsn=\'',strtypesn,'\'');
PREPARE stmt26 FROM @strSQL26;
EXECUTE stmt26;
就无法执行了...必须把 INTO后面的变量换成 Session级别的...本人猜测的原因:是因为动态SQL是Session级别的,所以里面的变量也必须是Seesion级别的,
因为@strSQL26改为declare 的strSQL26 使用到动态SQL中是不能通过语法检测的....

4.@variable为Session级别的,作用范围就不用说了,只要连接不短开值就保存...

感觉让我很不爽,所以就先写出来下.................................所以希望 MySQL能改改或者那位高人修改下MySQL源代码...(兄弟我目前还没这本事...)

使用道具 举报

回复
论坛徽章:
52
2015年新春福章
日期:2015-03-06 11:57:312012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:32:552012新春纪念徽章
日期:2012-02-07 09:59:35
77#
 楼主| 发表于 2008-3-26 09:59 | 只看该作者
再补充下:
Declare 变量的名称千万不要与列名称同名......语法上到不会出问题....但是会出现二意性的问题...

特别是select accountid into accountid from account 方式的时候.............

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2006-05-11 15:55:152011新春纪念徽章
日期:2011-02-18 11:42:492013年新春福章
日期:2013-02-25 14:51:24
78#
发表于 2008-4-2 18:13 | 只看该作者
感谢这么好的贴子!!!!

使用道具 举报

回复
论坛徽章:
40
生肖徽章2007版:马
日期:2008-04-07 19:43:48管理团队成员
日期:2011-05-07 01:45:082012新春纪念徽章
日期:2012-02-13 15:08:092012新春纪念徽章
日期:2012-02-13 15:08:092012新春纪念徽章
日期:2012-02-13 15:08:092012新春纪念徽章
日期:2012-02-13 15:08:092012新春纪念徽章
日期:2012-02-13 15:08:09马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14
79#
发表于 2008-4-9 09:30 | 只看该作者
把这个帖子贴到你这里来吧
http://www.itpub.net/viewthread.php?tid=884746&elevator=1

使用道具 举报

回复
论坛徽章:
0
80#
发表于 2008-4-18 11:46 | 只看该作者
什么都没有嘛

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表