2012-07-29 66 views
0

我遇到了一個問題,那就是我執行了一個存儲過程,它在數據庫中的幾個表上執行更新。錯誤是這樣完成的,每次只有一個字段(代表相同的記錄ID)更新爲新的ID。這是spoc:存儲過程與普通查詢的行爲不同

DROP PROCEDURE IF EXISTS feeds_transfer; 
DELIMITER $$ 
CREATE PROCEDURE feeds_transfer(IN original_owner INT, IN new_owner INT, IN feed_id INT) 
    BEGIN 
     UPDATE `events` SET `user_id` = new_owner WHERE `user_id` = original_owner AND `feed_id` = feed_id; 
     UPDATE `feeds` SET `partner_id` = new_owner WHERE `partner_id` = original_owner AND `id` = feed_id; 
    UPDATE `ics_uploads` SET `user_id` = new_owner WHERE `user_id` = original_owner AND `context_type` = 'feed' AND `context_id` = feed_id; 
    UPDATE `images` SET `user_id` = new_owner WHERE `user_id` = original_owner AND `context` = 'feed' AND `context_id` = feed_id; 
    UPDATE `private_feed_invitees` SET `user_id` = new_owner WHERE `user_id` = original_owner AND `feed_id` = feed_id; 
     UPDATE `subscribed_feeds` SET `user_id` = new_owner WHERE `user_id` = original_owner AND `feed_id` = feed_id; 
    END $$ 
DELIMITER ; 

會發生什麼是subscribed_feeds表將更新其中user_id = original_owner的每個記錄。它就像忽略了feed_id = feed_id

回答

1

好的,這裏發生的並不是feed_id = feed_id子句被忽略,它始終是真實的,所以它總是觸發更多的更新,而不是希望的更新。這個故事的寓意是,你永遠不應該把你的存儲過程的輸入變量命名爲與你打算進行邏輯檢查的任何字段相同的東西。