MySQL存储过程UPDATE仅更改第一行

时间:2018-03-20 13:37:43

标签: mysql stored-procedures

我有以下watching

enter image description here

如果我运行这个简单的测试查询:

UPDATE 
    `watching`
SET 
    `lastPriceSeen` = 1.33 
WHERE 
    `email` = 'blablanfff@gmail.com' AND 
    `productId` = 254857265 
LIMIT 1

行ID 10正确更新为lastPriceSeen

中的1.33

如果我将其转换为存储过程:

DELIMITER ;;
CREATE PROCEDURE `updateLastSeenPrice`(
    email VARCHAR(100),
    productId INT(11),
    price FLOAT
)
    DETERMINISTIC
    COMMENT 'Updates watcher last seen price'
BEGIN
    UPDATE 
        `watching`
    SET 
        `lastPriceSeen` = price 
    WHERE 
        `email` = email AND 
        `productId` = productId 
    LIMIT 1;
END;;
DELIMITER ;

并运行CALL updateLastSeenPrice('blablanfff@gmail.com','254857265', 1.11)

当我期望更新行ID 10时,只有第一行(ID 1)会更新价格。

这对我来说没有意义,WHERE子句应该防止这种情况发生,并且它是相同的查询!我甚至在存储过程的末尾添加了一个SELECT来测试它正确接收IN参数,它是......

有关第一行更新原因的任何想法?当WHERE子句阻止它这样做时,为什么匹配呢?

1 个答案:

答案 0 :(得分:3)

WHERE子句没有看到列名和参数名之间的区别。因此,任何记录都会执行,它将更新第一个记录。

将其更改为:

CREATE PROCEDURE `updateLastSeenPrice`(
    p_email VARCHAR(100),
    p_productId INT(11),
    p_price FLOAT
)
    DETERMINISTIC
    COMMENT 'Updates watcher last seen price'
BEGIN
    UPDATE 
        `watching`
    SET 
        `lastPriceSeen` = p_price 
    WHERE 
        `email` = p_email AND 
        `productId` = p_productId 
    LIMIT 1;
END;;
DELIMITER ;