问题: 我有一个mySql存储过程,它运行以下更新:
IF target = 'sup' THEN
UPDATE my_table SET deleted = 1, last_updated = lastUpdate WHERE id = ID AND user_id = accountID;
END IF;
输入参数为:
(IN ID BIGINT, IN lastUpdate DATETIME, IN target VARCHAR(3), IN accountID BIGINT)
当调用此sproc时,mySql会更新表中user_id的所有行,并且似乎忽略了WHERE子句中的id。
背景 移动应用程序对.NET Web服务进行ajax json调用,然后调用mySql sproc。
json调用如下:
{"id":["5","6","10"],"lastUpdated":"2014-07-19 22:28:53","target":"sup","accountID":"309"}
在.net webservice上,它将每个id条目转换为Int64并将其发送到mySql sproc:
For Each checkedID As String In id
cmd.Parameters.AddWithValue("@ID", CType(checkedID, Int64)).Direction = ParameterDirection.Input
cmd.Parameters.AddWithValue("@lastUpdate", dte).Direction = ParameterDirection.Input
cmd.Parameters.AddWithValue("@target", target).Direction = ParameterDirection.Input
cmd.Parameters.AddWithValue("@accountID", accountID).Direction = ParameterDirection.Input
cmd.ExecuteNonQuery()
cmd.Parameters.Clear()
Next
研究和修复尝试: 大量搜索
使用MySQL Workbench;直接正确运行SQL只更新目标行:
UPDATE my_table SET deleted = 1, last_updated = '1970-01-01 10:10:10' WHERE id = "7" AND user_id = 309;
但是,如果我从MySQL Workbench中调用sproc,它仍会更新目标用户的所有行:
CALL `my_sproc`(7, '1990-01-01 10:10:10', 'sup', 309);
我看不出任何问题,除非我只是看了太长时间。移动应用程序已接近100个MySQL sprocs,这是唯一导致问题的。
我很难过。
答案 0 :(得分:0)
只需添加对表的显式引用即可解决问题。
my_table.id