Tag 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
正在为 [...]

MySQL5.0 不能使用自动增加字段问题解决

引起的原因是在mysql5.0.2版本中的The Server SQL Mode 中新加了几种 sql_mode,并且在sql的my.ini文件中的sql-mode 默认增加了其中的二种,一个是STRICT_TRANS_TABLES,就是导致auto_increament失败的mode,这个sql_mode主 要用于 当一个值不能插入到表中是,则产生一个错误而不是一个警告并终止会话.解决办法:删除这个sql_mode.重启mysql.
|>g\u0017>UYni\u0015
9VSF\u0018Zau’\u0004 将 my.ini 中的:
%f,\u0012]c]zDX
T’`~\u001C];\u0013W\u0019 # Set the SQL mode to strict
}6ts\u00057\u0006d\u000C{ sql-mode=”STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION”
;. Ox+~\u0005kP
~\u001E\u001FRs8\u0006 E[ 改为:
\u0006\u0011G\u001F0?1\u0016\u0002$
tfyY\u001A]gx\u001E\u0006 # Set the SQL mode to strict
\u0018#y7v=xL\u000CP #sql-mode=”STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION”
sql-mode=”NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION”