程序中的更新不起作用

Posted

技术标签:

【中文标题】程序中的更新不起作用【英文标题】:UPDATE in Procedure does not work 【发布时间】:2013-08-19 20:04:40 【问题描述】:

我有 2 个表格:问题和测验。

测验是问题的集合。

测验表如下所示:

测验ID | QuestionIds (NVARCHAR50)

  1      |   1,2,3,4,5
  2      |   6,7,8,9

问题表有主键 ID(整数)、问题和状态字段

我想编写一个程序来更新问题表中所有问题的状态。

以下查询在 SQL 控制台中有效

UPDATE questions SET ActiveStatus = 'X' 
WHERE FIND_IN_SET(ID, (SELECT QuestionIds from quiz where QuizId = 2)) > 0

这里更新了 4 行。

但是,当我将相同的查询放入存储过程并使用参数执行时,它不起作用。

存储过程代码:

CREATE DEFINER=`root`@`localhost` 
PROCEDURE `update_quiz_status`(IN `QuizId` INT, IN `Status` VARCHAR(1))
MODIFIES SQL DATA
SQL SECURITY INVOKER
UPDATE questions SET ActiveStatus = Status 
WHERE FIND_IN_SET(ID, (SELECT QuestionIds from quiz where QuizId = QuizId)) > 0

过程没有语法错误。

当我从 SQL 控制台调用该过程时,出现错误:

call update_quiz_status(2,'X');

错误:#1242 - 子查询返回多于 1 行

我不知道为什么查询在 SQL 控制台中有效,但在存储过程中无效!

还有其他方法可以实现吗?即通过 SQL 过程更新给定测验的问题状态。

【问题讨论】:

mysql Stored Procedure's parameter with the same name as affecting's column, is it possible? 的可能重复项 【参考方案1】:

你的问题来了

SELECT QuestionIds from quiz where QuizId = QuizId

第二个QuizId 指的是传递的参数。然而,解析器将其视为quiz 表中的QuizId,因此返回该表中的所有行。

更改你的参数名称,你应该没问题。

【讨论】:

【参考方案2】:

你有一个非常非常糟糕的数据结构。您应该有一个表格QuizQuestions,每个问题和测验只有一行。

也就是说,问题出在这一行:

WHERE FIND_IN_SET(ID, (SELECT QuestionIds from quiz where QuizId = QuizId)) > 0

QuizId 在这两种情况下都是相同的。您应该将变量重命名为 v_QuizId 之类的名称,然后为 where 子句使用别名:

WHERE FIND_IN_SET(ID, (SELECT QuestionIds from quiz q where q.QuizId = v_QuizId)) > 0

【讨论】:

以上是关于程序中的更新不起作用的主要内容,如果未能解决你的问题,请参考以下文章

mysql过程中的更新语句不起作用

iOS 查询更新不起作用

Laravel 审核更新事件不起作用

每秒更新 ListView 处理程序不起作用

更新反应材料 ui 滑块的状态/值不起作用

DataGrid 数据绑定/更新中的 WPF 组合框不起作用