0

データベース内のいくつかのテーブルを更新するストア プロシージャを実行したときに問題が発生しました。エラーは、(同じレコード ID を表す) 1 つのフィールドのみが毎回新しい ID に更新されるように行われました。これはスポットです:

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を無視するようなものです

4

1 に答える 1

1

ここで起こっていることは、feed_id= feed_id 句が無視されているということではなく、常に true であるため、常に期待以上の更新がトリガーされるということです。この話の教訓は、ストアド プロシージャへの入力変数に、論理チェックを行う予定のフィールドと同じ名前を付けてはならないということです。

于 2012-07-29T22:01:48.267 に答える