我在存储过程中有一个临时表,这给我带来了一些麻烦。出现的基本症状是它不允许我按特定列排序。
-- Mockup table
CREATE TEMPORARY TABLE `result` (
col_a INT,
col_b VARCHAR(100),
col_c VARCHAR(100),
col_d VARCHAR(100));
-- Imagine inserting and updating a bunch of data here...
-- And then we select
SELECT
*
FROM
result
ORDER BY
col_b ASC,
col_c ASC,
col_d ASC;
上面的内容会让 MySQL 愉快地脱口而出一个由col_c
then排序的结果集col_d
。col_b
根本没有订购。
尝试了所有可能的排列并得出结论,有两列总是拒绝排序(我的实际表中的真实姓名分别是department
and 和userid
and VARCHAR(100)
)INT
。
因此,尝试在临时表上使用排序规则和数据库引擎,但这没有效果。在任一列中都找不到任何奇怪的数据。
result
现在今天早上我尝试制作我命名的表的精确副本resultCopy
并做了等效的操作(但是对于真实的列名,真实的表有 15 列,这对于这个例子来说有点多):
INSERT INTO `resultCopy` (col_a, col_b, col_c, col_d)
SELECT col_a, col_b, col_c, col_d
FROM result;
SELECT
*
FROM
resultCopy
ORDER BY
col_b ASC,
col_c ASC,
col_d ASC;
我得到的结果在两个不可排序的列中都只有 NULL 值。除此之外排序顺序完全相同。
所以,我的原始result
表中有数据(包括不可排序的列),当从表中选择时,这些数据显然被返回(在终端 MySQL 客户端和 MySQL Workbench 以及我的应用程序中,它只是排序错误)但是如果我尝试将此数据插入到相同的临时表中,它就会丢失。
哦,为了增加乐趣,如果我在程序结束时不删除临时表 ( result
) 并在运行程序后再次运行我的选择查询,它排序就好了。
那么,有人知道这里发生了什么吗?
MySQL版本:5.1.41-3ubuntu12.10