Re: [SQL ] 請問if() insert else update
自己回答自己
這裡寫成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)
討論串 (同標題文章)