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 cron_hash=@cronHashVar;END$$
DELIMITER ;

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

'SELECT SQL_NO_CACHE * FROM messages_temp WHERE cron_hash=@cronHashVar;

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

0

Решение

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

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

0

Другие решения

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

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

По вопросам рекламы [email protected]