为了账号安全,请及时绑定邮箱和手机立即绑定

MySQL查询在更新后以不同的顺序返回列

MySQL查询在更新后以不同的顺序返回列

PHP
哆啦的时光机 2022-06-17 17:02:49
我的一个程序是使用此查询来获取所选表列的详细信息:SELECT c.COLUMN_NAME as column_name,       c.COLUMN_TYPE as column_type,       c.CHARACTER_MAXIMUM_LENGTH as length,       c.TABLE_NAME as table_name,       c.COLUMN_COMMENT as column_comment,       k.REFERENCED_TABLE_NAME as reference_table,       k.REFERENCED_COLUMN_NAME as reference_columnFROM information_schema.COLUMNS as cLEFT JOIN information_schema.KEY_COLUMN_USAGE as k    ON (k.TABLE_SCHEMA=c.TABLE_SCHEMA   AND k.TABLE_NAME=c.TABLE_NAME   AND k.COLUMN_NAME=c.COLUMN_NAME   AND k.POSITION_IN_UNIQUE_CONSTRAINT IS NOT NULL) WHERE c.TABLE_SCHEMA='$db_name'   AND c.TABLE_NAME='$table_name'以前的结果是:数组(36) { [0]=> 数组(7) { ["column_name"]=> 字符串(2) "id" ["column_type"]=> 字符串(7) ...该表中的第一列是id,在结果数组中,第一个索引是id(因为它应该是)。然而,现在,在更新 PHP(从 5.6 到 7.3)和 MySQL 之后,结果排序有所不同。它不是根据列的创建日期优先级进行排序,而是根据一些未知元素(id数组中的第三个索引)进行排序。这是一个错误还是什么?我怎样才能找回原来的排序顺序?好吧,我刚刚想通了一些事情。MySQL首先使用外键对列进行排序,然后是其余列。我不要这个!我怎样才能找回原来的排序顺序?
查看完整描述

2 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

我不知道为什么你的输出改变了,但我认为要得到你想要的输出,你可以使用一个ORDER BY子句按序号位置排序。


ORDER BY c.ORDINAL_POSITION

当我在我自己的一个 MySQL 数据库上运行您的查询时,我在您的ed 列c.*列表中添加了一个。SELECT从显示的所有额外列中,这ORDINAL_POSITION似乎就是您要查找的内容。


所以你的最终查询可能看起来像这样:


SELECT c.COLUMN_NAME as column_name,

       c.COLUMN_TYPE as column_type,

       c.CHARACTER_MAXIMUM_LENGTH as length,

       c.TABLE_NAME as table_name,

       c.COLUMN_COMMENT as column_comment,

       k.REFERENCED_TABLE_NAME as reference_table,

       k.REFERENCED_COLUMN_NAME as reference_column

FROM information_schema.COLUMNS as c

LEFT JOIN information_schema.KEY_COLUMN_USAGE as k

    ON (k.TABLE_SCHEMA=c.TABLE_SCHEMA

      AND k.TABLE_NAME=c.TABLE_NAME

      AND k.COLUMN_NAME=c.COLUMN_NAME

      AND k.POSITION_IN_UNIQUE_CONSTRAINT IS NOT NULL)

WHERE c.TABLE_SCHEMA='$db_name'

      AND c.TABLE_NAME='$table_name'

ORDER BY c.ORDINAL_POSITION


查看完整回答
反对 回复 2022-06-17
?
MYYA

TA贡献1868条经验 获得超4个赞

SQL 表中没有“默认”排序顺序,至少没有 ANSI 标准要求的排序顺序(或者,正如您在此处看到的,由 MySQL 实现)。如果您希望结果集按特定顺序排列,则应添加适当的ORDER BY子句,例如


SELECT

    c.COLUMN_NAME as column_name,

    c.COLUMN_TYPE as column_type,

    ...

ORDER BY

    c.COLUMN_NAME;

至于为什么感知的排序顺序发生了变化,可能与从数据库中获取记录的方式有关。随着底层数据的变化,MySQL 选择访问记录的方式也可能发生变化。


查看完整回答
反对 回复 2022-06-17
  • 2 回答
  • 0 关注
  • 151 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信