作者imntu ()
看板Database
标题Re: [SQL ] 请问if() insert else update
时间Fri Aug 21 17:55:16 2009
自己回答自己
这里写成stored procedure / mysql
-------------------------------------------------
DELIMITER $$
CREATE PROCEDURE p_test2 (in_id varchar(30),in_length int(10),in_weight int(10),OUT ret_flag INT)
begin
update user_profile set p_length=in_length and p_weight=in_weight where id=in_id;
set ret_flag=1;
if FOUND_ROWS()=0 then
insert into user_profile(id,p_length,p_weight)
values (in_id,in_length,in_weight);
set ret_flag=2;
end if;
commit;
end$$
DELIMITER ;
-------------------------------------------------
推荐SQLyog,直接创建一个预存程序,
写完记得按F9执行,才会真正写入。
写入成功会在左手边看到一个刚刚命名的齿轮。
以下是php部分
<?
$id='888';
$length=180;
$weight=70;
/*
连结资料库
*/
$call_sp="call p_test2($id,$length,$weight,@flag)";
mysql_query($call_sp,$资料库连结); //-------这时候@flag变数会留在mysql里面
$getFlag="select @flag";
$getResult=mysql_query($getFlag,$资料库连结);
$row=mysql_fetch_array['$getReturn'];
echo $row['@flag']; //-----1为update旧资料成功
2为原本没资料,insert成功
?>
至於为何没有先select之後再决定update或insert
是因为效率问题
select table之後再判断浪费了处理时间
有个好方法,逻辑是
不管table有没有资料都先update
如果无法update,系统会给回应
这时候成功就执行完毕
失败的话 //if FOUND_ROWS()=0
//这里用 ROW_COUNT()=0也行 但限於mysql版本(v5.0.1)以上
我们就知道没资料,这时候就insert了
简单说,就是霸王硬上弓的意思XD
※ 引述《imntu ()》之铭言:
: 请问如果我想把一个人(id=8888)加入资料库里面
: 但是我不知道是不是以前已经有过他的资料
: 所以我先查一下是否有这人select count(*)
: 如果没有的话(@result=0)
: 就insert
: 如果已经有就update
: 代码如下,mysql
: -------------------------------------------
: set @result=(select count(*) from user_profile where id='8888');
: if @result= 0
: then (insert user_profile (p_length,p_weight) values ('180','70'));
: else (update user_profile set p_length='180' where p_weight='70');
: end if
: -------------------------------------------
: 但是一直出现错误 Error Code : 1064
: 语法错误,但是找遍书籍和网路,找不到解法。
: 请问有人知道错在哪里吗?
: ----
: 刚爬文之後成功。
: insert user_profile set p_length='180',p_weight='70',id='8888'
: ON DUPLICATE KEY UPDATE p_length='180',p_weight='70';
: 但是if...else到底错在哪里??
: 想不通。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 210.74.155.210
※ 编辑: imntu 来自: 210.74.155.210 (08/21 18:26)