MySQL按主键顺序排序

时间:2014-10-01 19:35:23

标签: mysql sql sql-order-by primary-key

某些SQL服务器允许使用ORDER BY PRIMARY KEY等通用语句。我不相信这适用于MySQL,是否有任何此类解决方法允许跨多个表自动选择或是否需要查询查询来确定主键?

我一直在努力解决的问题是在运行查询之前调用SHOW COLUMNS FROM。有更有效的方法吗? MySQL能否在选择过程中确定表的主键?

更新:正如Gordon指出的那样,在MySQL或SQL中没有正式的方法。 SAP具有自定义功能。有一些解决方法,例如使用约翰指出的SHOW COLUMNS FROM tableinformation_schema

2 个答案:

答案 0 :(得分:8)

MySQL通常按插入顺序将数据拉出,这可能是主键,但除此之外,如果你拉出主键列名并按顺序将其放入

,那么技术上可以做同样的事情。
SELECT whatever FROM table
ORDER BY
(   SELECT `COLUMN_NAME`
    FROM `information_schema`.`COLUMNS`
    WHERE (`TABLE_SCHEMA` = 'dbName')
      AND (`TABLE_NAME` = 'tableName')
      AND (`COLUMN_KEY` = 'PRI')
);

对于复合键,您可以使用此

SELECT whatever FROM table
ORDER BY
(   SELECT GROUP_CONCAT(`COLUMN_NAME` SEPARATOR ', ')
    FROM `information_schema`.`COLUMNS`
    WHERE (`TABLE_SCHEMA` = 'dbName')
      AND (`TABLE_NAME` = 'tableName')
      AND (`COLUMN_KEY` = 'PRI')
);

来自DOCS

的信息模式访问权限
  

每个MySQL用户都有权访问这些表,但是   只能看到表中与对象对应的行   用户具有适当的访问权限。在某些情况下(for   例如,中的ROUTINE_DEFINITION列   INFORMATION_SCHEMA.ROUTINES表),用户不足   权限见NULL。这些限制不适用于InnoDB   表;只有PROCESS权限才能看到它们。

     

相同的权限适用于从中选择信息   INFORMATION_SCHEMA并通过SHOW查看相同的信息   声明。在任何一种情况下,您都必须拥有某个对象的特权   查看有关它的信息。

SETUP:

CREATE TABLE some_stuff (
    firstID INT,
    secondID INT,
    username varchar(55),
    PRIMARY KEY (firstID, secondID)
) ;

QUERY:

SELECT GROUP_CONCAT(`COLUMN_NAME` SEPARATOR ', ')
FROM `information_schema`.`COLUMNS`
WHERE (`TABLE_SCHEMA` = 'dbName')
  AND (`TABLE_NAME` = 'some_stuff')
  AND (`COLUMN_KEY` = 'PRI');

输出:

+--------------------------------------------+
| GROUP_CONCAT(`COLUMN_NAME` SEPARATOR ', ') |
+--------------------------------------------+
|              firstID, secondID             |
+--------------------------------------------+

答案 1 :(得分:1)

评论太长了。

SAP确实这样做了(http://help.sap.com/saphelp_nw04s/helpdata/en/fc/eb3a53358411d1829f0000e829fbfe/content.htm)。 SQL Server也基于Sybase,我不认为Sybase支持此功能。语法有很多限制。

在一个具有主键,没有显式order by和没有where条件的表上的查询中,MySQL通常会以主键顺序返回结果。您不能依赖此功能,但它对您的系统来说可能已经足够了。

最大的问题是使用where子句的索引。如果桌面上没有索引,您不必担心。如果有,您可以使用物化视图模拟行为:

select t.*
from (select t.*
      from table t
     ) t
where <where clause here>;

另一种选择是强制数据库引擎使用主键索引。您可以使用force index hint执行此操作。问题是您需要知道索引的名称。