1

我在存储过程中有一个临时表,这给我带来了一些麻烦。出现的基本症状是它不允许我按特定列排序。

-- 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_cthen排序的结果集col_dcol_b根本没有订购。

尝试了所有可能的排列并得出结论,有两列总是拒绝排序(我的实际表中的真实姓名分别是departmentand 和useridand 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

4

0 回答 0