Category Archives: Mysql

Mysql的预处理语句

mysql的官方案例,先留档,以后写个通用类~
http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html#sqlps
第一个例子显示如何通过使用文字字符串来创建一个预制语句,以提供语句的文本:
mysql> PREPARE stmt1 FROM ‘SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse’;
mysql> SET @a = 3;
mysql> SET @b = 4;
mysql> EXECUTE stmt1 USING @a, @b;
+————+
| hypotenuse |
+————+
|          5 |
+————+
mysql> DEALLOCATE PREPARE stmt1;
第二个例子是相似的,不同的是提供了语句的文本,作为一个用户变量:
mysql> SET @s = ‘SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse’;
mysql> PREPARE stmt2 FROM @s;
mysql> SET @a = 6;
mysql> SET @b = 8;
mysql> EXECUTE stmt2 USING @a, [...]

Mysql存储过程中的in、out和inout

in、out和inout不能简单理解为一个方法的参数和返回值,而是面向整个过程上下文变量的。
再烘托一下这位仁兄:http://blog.csdn.net/ethansky/archive/2009/08/20/4467178.aspx
in
基本可以理解为传入function的参数,而如果该参数是个变量,那么整个procedure过程结束后,不会影响外部的变量值。
可以直接这样:
call abc(’a’);   这种情况直接给in类型的参数赋值。
针对上下文的情况:
set @a=’aa’;   给一个变量赋值

call abc(@a);   这里@a作为一个in类型的参数传给abc

不管这个procedure内部把这个参数赋予了什么值,之后再 selece @a; @a的值都还是’aa’。
out
可以理解为某个function要改变的外部变量,不管这个变量在外部是什么值,在内部的初始值都是null,而内部对它的影响将改变这个外部变量值。
直接给一个procedure传一个out参数是没有意义的,因为out值在procedure默认都会被初始为null。
针对上下文情况:
set @b=’aa’;
call abc(@b);   @b作为一个out类型的变量传进去,在这个procedure中对@b所对应的变量进行了操作,赋值了’cc’。
之后 select @b;    @b是’cc’。
而且,@b的初始值对这个procedure是无效的,在procedure中@所对应的变量默认值为null。

inout
可以理解为一个function在内部声明了global ,并可能对该变量值进行修改。
针对上下文情况:
set @b  =’aa’;
call abc(@b);   在这个procedure中对b所对应的变量进行了操作,@所对应的procedure变量的初始值就是@b的值。
之后 select @b;  这时候,@b得值就是在procedure中被改变得值。

PHP与MYSQL的存储过程(很全面,转)

http://blog.csdn.net/binger819623/archive/2010/03/15/5382300.aspx
实例一:无参的存储过程
$conn = mysql_connect(’localhost’,’root’,’root’) or die (”数据连接错误!!!”);
mysql_select_db(’test’,$conn);
$sql = ”
create procedure myproce()
begin
INSERT INTO user (id, username, sex) VALUES (NULL, ’s’, ‘0′);
end;
“;
mysql_query($sql);// 创建一个myproce的存储过程
$sql = “call test.myproce();”;
mysql_query($sql);// 调用myproce的存储过程,则数据库中将增加一条新记录。
实例二:传入参数的存储过程
$sql = ”
create procedure myproce2(in score int)
begin
if score >= 60 then
select ‘pass’;
else
select ‘no’;
end if;
end;
“;
mysql_query($sql);// 创建一个myproce2的存储过程
$sql = “call test.myproce2(70);”;
mysql_query($sql);// 调用myproce2的存储过程,看不到效果,可以在cmd下看到结果。
实例三:传出参数的存储过程
$sql = ”
create procedure myproce3(out score int)
begin
set score=100;
end;
“;
mysql_query($sql);// [...]

Mysql中function和procedure的区别和实践

网上搜罗了很多关于这方面的资料,都没有找到正解,自己整理一下吧~
1,Mysql手册中把function和procedure放在一起讲解,这个是造成大家困扰的很大一个方面。其实,function就当作php的function来理解就ok,而procedure是实现某一个功能的一整套动作和过程。function很简单,执行了他,得到对应想要的结果,如:截取字符串;而procedure用来实现某一个用例,如做一连串的数据库操作。
2,procedure有in\out\inout类型的参数,但function只有默认的in类型的参数。至于procedure中in等类型怎样用,请参考:http://blog.csdn.net/ethansky/archive/2009/08/20/4467178.aspx 这位仁兄写的超级详细。
3,function 总是要有明确的return来返回结果,而procedure需要另外的方式来做。
4,一些实践:
a,一个自定义的function:
DELIMITER $$
DROP FUNCTION IF EXISTS `hello`$$
CREATE DEFINER=`root`@`localhost` FUNCTION `hello`(s CHAR(20)) RETURNS char(50) CHARSET utf8
RETURN CONCAT(’Hello, ‘,s,’!’)$$
DELIMITER ;
我可以这样将自定义函数直接用于SQL中:
insert into test (name,status) values (hello(’a’),1);
b,对于procedure,可以这样:
DELIMITER $$
DROP PROCEDURE IF EXISTS `add_comment`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `add_comment`(`entry_id` int,`new_content` text)
BEGIN
DECLARE true_id int DEFAULT 0;
select `id` into true_id from `sgtest`.`blog_entries` where `id`=entry_id;
IF true_id>0 THEN
insert into `sgtest`.`blog_comments` (`entry_id`,`content`) values(entry_id,hello(new_content) );
END IF;
END$$

mysql触发器以及在phpmyadmin中的使用

mysql的触发器和oracle的类似,都是针对具体的三种情况(insert、delete、update)做after或者before处理,里面可以再写if等语句。
另外就是new.和old. 这个注意一下insert情况下没有old.的说。
mysql对触发器官方中文介绍:http://dev.mysql.com/doc/refman/5.1/zh/triggers.html
我用了这个很简单的例子来学习:http://www.cnblogs.com/nicholas_f/archive/2009/09/22/1572050.html
我用了phpmyadmin 3.0+来写触发器:
CREATE TRIGGER t_afterdelete_on_tab1
AFTER DELETE ON tab1
FOR EACH ROW
BEGIN
delete from tab2 where tab2_id=old.tab1_id;
END;
但是每次都报错:#1064 – You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘delete from tab2 where tab2_id=old.tab1_id’ at line 5
然后,见到了delimiter这个命令,试着写成这样(注意,这么写是没错的,但是在phpmyadmin的sql窗口中不行,在mysql内或者用php执行的时候是没问题的):
DROP TRIGGER IF EXISTS [...]

mysql的简单事务处理

$db->execute(’BEGIN;’);
$sql1 = ‘insert into shiwu (name,status) values (\”.time().’\’,1)’;
$sql2 = ‘insert into shiwu (name,status) values (\”.time().’\’,2)’;
if($db->execute($sql1) && $db->execute($sql2)){
for($i=0;$i<99999999;$i++){}
$db->execute(’COMMIT;’);
echo ok;
}else{
$db->execute(”ROLLBACK;”);
echo ‘false’;
}

mysql进程状态值 show processlist

经常用这个看状态,今天查了一下到底都代表啥
mysql> show processlist;
+—–+————-+——————–+
| Id | User | Host | db | Command | Time| State | Info
+—–+————-+——————–+
id
一个标识,你要kill一个语句的时候很有用。
user
显示单前用户,如果不是 root,这个命令就只显示你权限范围内的sql语句。
host
显示这个语句是从哪个ip的哪个端口上发出的。
db
显示这个进程目前连接的是哪个数据库。
command
显示当前连接的执行的命令,一般就是休眠(sleep),查询(query),连接 (connect)。
time
此这个状态持续的时间,单位是秒。
info
显示这个sql语句,因为长度有限,所以长的sql语句就显示不全,但是一个判断问题语句的重要依据。
state
显示使用当前连接的sql语句的状态,很重要的列,后续会有所有的状态 的描述,请注意,state只是语句执行中的某一个状态,一个sql语句,已查询为例,可能需要经过copying to tmp table,Sorting result,Sending data等状态才可以完成。
Checking table
正在检查数据表(这是自动的)。
Closing tables
正在将表中修改的数据刷新到磁盘中,同时正在关闭已经用完的表。这是一个很快的操作,如果不是这样的话,就应该确认磁盘空间是否已经满了或者磁盘是否正处 于重负中。
Connect Out
复制从服务器正在连接主服务器。
Copying to tmp table on disk
由于临时结果集大于 tmp_table_size,正在将临时表从内存存储转为磁盘存储以此节省内存。
Creating tmp table
正在创建临时表以存放部分查询结果。
deleting from main table
服务器正在执行多表删除中的第一部分,刚删除第一个表。
deleting from reference tables
服务器正在执行多表删除中的第二部分,正在删除其他表的记录。
Flushing tables
正在执行 FLUSH TABLES,等待其他线程关闭数据表。
Killed
发送了一个kill请求给某线程,那么这个线程将会检查kill标志位,同时会放弃下一个kill请求。MySQL会在每次的主循环中检查kill标 志位,不过有些情况下该线程可能会过一小段才能死掉。如果该线程程被其他线程锁住了,那么kill请求会在锁释放时马上生效。
Locked
被其他查询锁住了。
Sending data
正在处理 SELECT 查询的记录,同时正在把结果发送给客户端。
Sorting for group
正在为 [...]

MongoDb In Action

MongoDb In Action
View more presentations from fuchaoqun.

Mysql深读2:数据操作语句

1. DELETE语法
tbl_name中有些行满足由where_definition给 定的条件。DELETE用于删除这些行,并返回被删除的记录的数目。

关于DELETE [LOW_PRIORITY] [QUICK] [IGNORE]

如果您指定LOW_PRIORITY,则DELETE的 执行被延迟,直到没有其它客户端读取本表时再执行。
对于MyISAM表,如果您使用QUICK关键词,则在删除过程中,存储引擎不会合并索引端结点, 这样可以加快部分种类的删除操作的速度。
在删除行的过程中,IGNORE关键词会使MySQL忽 略所有的错误。(在分析阶段遇到的错误会以常规方式处理。)由于使用本选项而被忽略的错误会作为警告返回。

关于多表删除

DELETE t1 FROM t1,t2 WHERE t1.id=t2.id  虽然牵扯了两张表,但是只删除t1中那些id值在t2里有匹配的记录
DELETE  FROM t1 USING t1,t2 WHERE t1.id=t2.id 这个同上
DELETE t1 FROM t1 LEFT JOIN T2 ON t1.id=t2.id WHERE t2.id IS NULL 只删除t1中那些id值没有在t2中的记录
DELETE  FROM t1,USING t1 LEFT JOIN T2 ON t1.id=t2.id WHERE t2.id IS NULL 这个同上
DELETE t1,t2 FROM t1 LEFT JOIN t2 ON [...]

Mysql深读1:数据定义语句

用了10年mysql了,这次准备好好学习一下,不能老是半桶水
1,ALTER DATABASE语法
用来改变database的状态
CHARACTER SET子句用于更改默认的数据库字符集
COLLATE子句用于更改默认的数据库整序。
例:
ALTER DATABASE `ozdeom` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
2,ALTER TABLE语法
用于更改原有表的结构。例如,您可以增加或删减列,创建或取消索引,更改原有列的类型,或重新命名列或 表。您还可以更改表的评注和表的类型。
使用方法略..
3,CREATE DATABASE语法
CREATE DATABASE用于创建数据库,并进行命名。如果要使用CREATE DATABASE,您需要获得数据库CREATE权限。
例如:
CREATE DATABASE `abc` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
和alert database一样,DEFAULT CHARACTER SET设置默认字符集,COLLATE设置数据库整序。
注:在alert database和create database中,都可以写为 create SCHEMA或者 alert schema 效果是一样的。、
4,CREATE INDEX语法
CREATE INDEX被映射到一个ALTER TABLE语句上,用于创建索引。
5,CREATE TABLE语法
6,DROP DATABASE语法
7,DROP INDEX语法
8,DROP TABLE语法
9,RENAME TABLE语法