2012-04-02 197 views
1

我在更新mysql表时遇到问题。虽然这个问题似乎有点奇怪,但我在下面解释它。mysqli存储过程和更新语句

我正在处理用户的配置文件更新,其中从单一表单的数据插入/更新到两个不同的表,但如果我更新整个表单信息,然后更新数据是成功的但如果我只更新一些2或3字段然后更新失败。我使用MySQL存储程序的SQL更新的代码是在...

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `usp_user_profile_save` $$ 
CREATE PROCEDURE `usp_user_profile_save`(IN sIntro_para VARCHAR(255), IN sBook VARCHAR(255), IN sProfileNewName VARCHAR(255), 
IN iRel VARCHAR(255), IN iBdate VARCHAR(255), IN iSO INT, IN iMerital_status INT, IN iChildren INT, IN iProfession INT, 
IN iIncome INT, IN iIncome_unit INT, IN iCountry INT, IN iState INT, IN iCity_or_post_code INT, IN iHeight VARCHAR(255), IN iSp INT, IN iEthnicity INT, 
IN iHair_color INT, IN iHair_lenght INT, IN iEye_color INT, IN iSmoker_or_not INT, IN iUserId INT) 
BEGIN 
DECLARE n,n1,respCode INT; 
DECLARE respMsg,dbg VARCHAR(255); 

    START TRANSACTION; 

    UPDATE `tbl_user` SET 
    `introduction` = sIntro_para, 
    `profile_picture` = sProfileNewName, 
    `birthdate` = iBdate, 
    `s_o` = iSO, 
    `marital_status` = iMerital_status, 
    `children` = iChildren, 
    `profession` = iProfession, 
    `income` = iIncome, 
    `income_unit` = iIncome_unit, 
    `my_book` = sBook, 
    `r_s` = iRel, 
    `counrty` = iCountry, 
    `state` = iState, 
    `city` = iCity_or_post_code, 
    `modified` = NOW(), 
    `modified_by` = iUserId 
    WHERE `id` = iUserId; 
    SET n = ROW_COUNT(); 

    IF n <= 0 THEN 
    ROLLBACK; 
    ELSE 

    IF EXISTS (SELECT * FROM `tbl_user_physical` WHERE `tbl_user_id` = iUserId) THEN 
     UPDATE `tbl_user_physical` SET 
     `tbl_user_id` = iUserId, 
     `height` = iHeight, 
     `shape` = iSp, 
     `ethnicity` = iEthnicity, 
     `hair_color` = iHair_color, 
     `hair_length` = iHair_lenght, 
     `eye_color` = iEye_color, 
     `smoker_or_non_smoker` = iSmoker_or_not 
     WHERE `tbl_user_id` = iUserId; 
     SET n1 = ROW_COUNT(); 

    ELSE 
     INSERT INTO `tbl_user_physical`(`tbl_user_id`, `height`, `shape`, `ethnicity`, `hair_color`, `hair_length`, `eye_color`, `smoker_or_non_smoker`) VALUES (iUserId, iHeight, iSp, iEthnicity, iHair_color, iHair_lenght, iEye_color, iSmoker_or_not); 
     SET n1 = LAST_INSERT_ID(); 
    END IF; 

    IF n1 > 0 THEN 
     COMMIT; 
     SELECT 1 AS respCode, 'Registration successfull.' AS respMsg; 
    ELSE 
     ROLLBACK; 
     SELECT 0 AS respCode,'Registration couldn\'t be completed.' AS respMsg, n, n1; 
    END IF; 
    END IF; 

END $$ 

DELIMITER; 

虽然我GOOGLE了我的问题很多时间用不同的关键字,但我不觉得有关问题矿山,我已经写update语句正确,但它没有更新,因为大部分将要更新的新数据与旧的一样,并且我的老大说我只有在提交并使用了一组新数据时才更新。

所以,请帮我解决这个问题 在此先感谢..

回答

0

我最近才知道如果我们更新相同的数据,语句返回错误。因此,我已更新添加新列modified_date并更新此字段与NOW(),以便至少有一列已更改,UPDATE语句不返回任何错误。