我有以下watching
表
如果我运行这个简单的测试查询:
UPDATE
`watching`
SET
`lastPriceSeen` = 1.33
WHERE
`email` = 'blablanfff@gmail.com' AND
`productId` = 254857265
LIMIT 1
行ID 10正确更新为lastPriceSeen
列
如果我将其转换为存储过程:
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子句阻止它这样做时,为什么匹配呢?
答案 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 ;