程序中的更新不起作用
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
【讨论】:
以上是关于程序中的更新不起作用的主要内容,如果未能解决你的问题,请参考以下文章