【问题标题】:mysql update updating all user rows in tablemysql update 更新表中的所有用户行
【发布时间】:2014-07-19 21:44:27
【问题描述】:

问题: 我有一个运行以下更新的 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 工作台;直接运行 SQL 会正确更新目标行:

UPDATE my_table SET deleted = 1, last_updated = '1970-01-01 10:10:10' WHERE id = "7" AND user_id = 309;

但是,如果我从 MySQL Workbench 中调用存储过程,它仍然会更新目标用户的所有行:

CALL `my_sproc`(7, '1990-01-01 10:10:10', 'sup', 309);

我看不出存储过程有什么问题,除非我看了太久。移动应用程序有接近 100 个 MySQL 存储区,这是唯一导致问题的存储区。

我被难住了。

【问题讨论】:

    标签: mysql asp.net json web-services mysql-workbench


    【解决方案1】:

    只需添加对表格的显式引用即可解决问题。

    my_table.id
    

    【讨论】:

      猜你喜欢
      • 2017-10-28
      • 1970-01-01
      • 2014-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      • 2012-10-31
      • 2022-01-21
      相关资源
      最近更新 更多