У меня следующая процедура
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;
Можете ли вы помочь мне, когда мне нужно, только запись только для обновления.
Там нет причин, почему я ожидается, что хранимая процедура обновит только одну строку. Если бы я предположил, что messages_temp(id)
были бы первичным ключом (или, по крайней мере, уникальным), тогда это предположение было бы правильным. Тот факт, что ваш запрос обновляет несколько строк, говорит о том, что это не так.
Если вы хотите обновить только одну строку, добавьте limit 1
до конца update
заявление.
Выбор для идентификаторов является условием предложения обновления. Используйте как это.
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"
,