Mysql 使用Coalesce-Won';不更新行

Mysql 使用Coalesce-Won';不更新行,mysql,coalesce,Mysql,Coalesce,我有一个MySQL查询,它利用COALESCE回溯空值,并将找到的第一个非空值分配给这些空值 通过使用不推荐使用的函数mysql_query以及使用mysqli并调用存储过程本身,从PHP脚本启动此查询,不会影响任何行;但是,如果我手动运行查询,或者手动调用查询的存储过程,则会正确更新行以生成所需的结果集。 DDL: 链接到SqlFiddle: 查询: UPDATE file_index SET idnumber = (@n := COALESCE(idnumber, @n)) ORDER BY

我有一个MySQL查询,它利用COALESCE回溯空值,并将找到的第一个非空值分配给这些空值

通过使用不推荐使用的函数mysql_query以及使用mysqli并调用存储过程本身,从PHP脚本启动此查询,不会影响任何行;但是,如果我手动运行查询,或者手动调用查询的存储过程,则会正确更新行以生成所需的结果集。

DDL:

链接到SqlFiddle:

查询:

UPDATE file_index
SET idnumber = (@n := COALESCE(idnumber, @n))
ORDER BY file_id, page ASC
当前结果集:

+----------+------+----------+
| file_id  | page | idnumber |
+----------+------+----------+
|   637847 |    2 |  1737929 |
|   637847 |    3 |     NULL |
|   637847 |    4 |    85956 |
|   637847 |    5 |   163262 |
|   637847 |    6 |  1171457 |
|   637847 |    7 |  1173838 |
|   637847 |    8 |  2264105 |
|   637847 |    9 |  2084006 |
|   637847 |   10 |  1298597 |
|   637847 |   11 |  2263042 |
|   637847 |   12 |  1288872 |
|   637847 |   13 |     NULL |
|   637845 |    2 |  2264143 |
|   637845 |    3 |     NULL |
|   637845 |    4 |  2019138 |
|   637845 |    5 |   157726 |
|   637845 |    6 |  2087837 |
|   637845 |    9 |  2264118 |
|   637845 |   10 |  2264124 |
|   637845 |   11 |     NULL |
+----------+------+----------+
+----------+------+----------+
| file_id  | page | idnumber |
+----------+------+----------+
|   637847 |    2 |  1737929 |
|   637847 |    3 |  1737929 |
|   637847 |    4 |    85956 |
|   637847 |    5 |   163262 |
|   637847 |    6 |  1171457 |
|   637847 |    7 |  1173838 |
|   637847 |    8 |  2264105 |
|   637847 |    9 |  2084006 |
|   637847 |   10 |  1298597 |
|   637847 |   11 |  2263042 |
|   637847 |   12 |  1288872 |
|   637847 |   13 |  1288872 |
|   637845 |    2 |  2264143 |
|   637845 |    3 |  2264143 |
|   637845 |    4 |  2019138 |
|   637845 |    5 |   157726 |
|   637845 |    6 |  2087837 |
|   637845 |    9 |  2264118 |
|   637845 |   10 |  2264124 |
|   637845 |   11 |  2264124 |
+----------+------+----------+
所需结果集:

+----------+------+----------+
| file_id  | page | idnumber |
+----------+------+----------+
|   637847 |    2 |  1737929 |
|   637847 |    3 |     NULL |
|   637847 |    4 |    85956 |
|   637847 |    5 |   163262 |
|   637847 |    6 |  1171457 |
|   637847 |    7 |  1173838 |
|   637847 |    8 |  2264105 |
|   637847 |    9 |  2084006 |
|   637847 |   10 |  1298597 |
|   637847 |   11 |  2263042 |
|   637847 |   12 |  1288872 |
|   637847 |   13 |     NULL |
|   637845 |    2 |  2264143 |
|   637845 |    3 |     NULL |
|   637845 |    4 |  2019138 |
|   637845 |    5 |   157726 |
|   637845 |    6 |  2087837 |
|   637845 |    9 |  2264118 |
|   637845 |   10 |  2264124 |
|   637845 |   11 |     NULL |
+----------+------+----------+
+----------+------+----------+
| file_id  | page | idnumber |
+----------+------+----------+
|   637847 |    2 |  1737929 |
|   637847 |    3 |  1737929 |
|   637847 |    4 |    85956 |
|   637847 |    5 |   163262 |
|   637847 |    6 |  1171457 |
|   637847 |    7 |  1173838 |
|   637847 |    8 |  2264105 |
|   637847 |    9 |  2084006 |
|   637847 |   10 |  1298597 |
|   637847 |   11 |  2263042 |
|   637847 |   12 |  1288872 |
|   637847 |   13 |  1288872 |
|   637845 |    2 |  2264143 |
|   637845 |    3 |  2264143 |
|   637845 |    4 |  2019138 |
|   637845 |    5 |   157726 |
|   637845 |    6 |  2087837 |
|   637845 |    9 |  2264118 |
|   637845 |   10 |  2264124 |
|   637845 |   11 |  2264124 |
+----------+------+----------+

无论出于何种原因,我必须运行两次查询,以使其生效并更新行。很奇怪,是的,但如果我发射两次,它会工作。

根据建议更新。我不确定正式定义,但在这里我认为“DDL”是指创建和插入语句。使用插入语句更新。很抱歉,但是考虑到您的问题只涉及列
idnumber
文件id
,而且
page
我很想把这个小把戏简化为相关的信息。我已经玩过你的sql小把戏了。事实上,如果您执行两次查询,它看起来确实有效。然而,这似乎是因为第二轮变量@n已经初始化(通过第一次查询)。如果
设置@n:=0在更新之前完成,它也可以工作。