2015-04-13 2 views
0

У меня есть следующая процедураMysql Процедура есть два раза

DELIMITER $$ 
CREATE PROCEDURE providerDistributor(IN cronHash VARCHAR(255), IN lastProccess DATETIME) 
BEGIN 
    SET @cronHashVar = cronHash; 
    SET @lastProccess = lastProccess; 

    SET @targetiDS = (SELECT `id` AS targetiDS FROM `messages_temp` WHERE 
       `direction` = "3" 
       AND `reciever_id` = 0 
       AND `status`="1" 
       AND `has_providers` = "1" 
        AND `reserved_bebs` = 0 
        AND `maximum_cost` > 0 
        AND `count_numbers`>0 
        AND (`app_mobile_numbers`>0 OR `sms_mobile_numbers`>0) 
        AND (`cron_hash`="" OR `cron_hash` IS NULL) ORDER BY `id` ASC LIMIT 1); 

    SET @sql_text = concat('UPDATE `messages_temp` SET `cron_hash` = "',@cronHashVar,'",`last_process` = "',@lastProccess,'",`cron_name` = "providerDestributor" WHERE id = @targetiDS AND (cron_hash="" OR cron_hash IS NULL)'); 

    PREPARE stmt FROM @sql_text; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 

    SELECT SQL_NO_CACHE * FROM messages_temp WHERE [email protected]; 


END$$ 
DELIMITER ; 

это следует обновить только одну запись, но она всегда обновляет две записи, как только я добавить последний запрос

'SELECT SQL_NO_CACHE * FROM messages_temp WHERE [email protected]; 

пожалуйста, вы можете помочь I нужно как только запись только обновиться.

ответ

0

Нет причин, по которым I ожидает, что хранимая процедура обновит только одну строку. Если бы я предположил, что messages_temp(id) были первичным ключом (или, по крайней мере, уникальным), то это предположение было бы правильным. Тот факт, что ваш запрос обновляет несколько строк, говорит о том, что это неверно.

Если вы хотите обновить только одну строку, добавьте limit 1 в конец инструкции update.

+0

Я добавляю ограничение 1 в конце инструкции обновления, он все еще обновляет 2 записи, если я вызываю процедуру один раз, но если вы удалите следующий запрос (SELECT SQL_NO_CACHE * FROM messages_temp WHERE cron_hash = @ cronHashVar;), он будет обновляться один раз запись, почему? – user2876390

+0

Идентификатор первичный, поэтому одна запись должна быть аппроксимирована вызовом процедуры, лимит после обновления есть – user2876390

+0

@ user2876390. , , Если 'id' уникален, то в этом выражении может быть обновлено не более одной строки. Почему, по-вашему, обновляется несколько строк? –

0

Выбор для ids является условием предложения об обновлении. Используйте как это.

DELIMITER $$ 
CREATE PROCEDURE providerDistributor(
    IN cronHash VARCHAR(255), 
    IN lastProccess DATETIME 
) 
BEGIN 
    SET @cronHashVar = cronHash; 
    SET @lastProccess = lastProccess; 
    UPDATE 
     `messages_temp` 
    SET 
     `cron_hash` = "@cronHashVar", 
     `last_process` = "@lastProccess", 
     `cron_name` = "providerDestributor" 
    WHERE 
     `direction`   = "3" 
     AND `reciever_id` = 0 
     AND `status`  = "1" 
     AND `has_providers` = "1" 
     AND `reserved_bebs` = 0 
     AND `maximum_cost` > 0 
     AND `count_numbers` > 0 
     AND (`app_mobile_numbers` > 0 OR `sms_mobile_numbers` > 0) 
     AND (`cron_hash` = "" OR `cron_hash` IS NULL); 
END$$ 
DELIMITER ; 

Примечание: Может быть присвоено значение cron_name = "providerDestributor" является "providerDistributor".

+0

Мне нужна одна запись, которую нужно обновить за один вызов, и верните обновленные записи по той же процедуре , если я добавлю добавить любой запрос после запроса обновления, тогда две записи будут обновляться вместо одной записи. Я тестирую его столько раз, но все тот же – user2876390

Смежные вопросы