Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL按主键排序_Mysql_Sql_Sql Order By_Primary Key - Fatal编程技术网

MySQL按主键排序

MySQL按主键排序,mysql,sql,sql-order-by,primary-key,Mysql,Sql,Sql Order By,Primary Key,某些SQL Server允许使用通用语句,如按主键排序。我认为这对MySQL不起作用,是否存在允许跨多个表自动选择的解决方案,或者是否需要一个查找查询来确定主键 我一直在研究的解决方法包括在运行查询之前调用SHOW COLUMNS。有没有更有效的方法?MySQL能否在选择过程中确定表的主键 更新:正如Gordon所指出的,在MySQL或SQL中一般没有官方的方法来实现这一点。SAP为其提供了自定义功能。有一些解决方法,例如使用表中的显示列或John指出的信息模式。MySQL通常按插入顺序(即主键

某些SQL Server允许使用通用语句,如按主键排序。我认为这对MySQL不起作用,是否存在允许跨多个表自动选择的解决方案,或者是否需要一个查找查询来确定主键

我一直在研究的解决方法包括在运行查询之前调用SHOW COLUMNS。有没有更有效的方法?MySQL能否在选择过程中确定表的主键


更新:正如Gordon所指出的,在MySQL或SQL中一般没有官方的方法来实现这一点。SAP为其提供了自定义功能。有一些解决方法,例如使用表中的显示列或John指出的信息模式。

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')
);
从中访问信息架构的权限

每个MySQL用户都有权访问这些表,但是 只能看到表中与对象对应的行 用户具有适当的访问权限。在某些情况下 例如,中的例程_定义列 信息_SCHEMA.ROUTINES表,没有足够资源的用户 特权见空。这些限制不适用于InnoDB 桌子;您只能使用“进程”权限查看它们

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

设置: 查询: 输出:
这篇评论太长了

SAP确实做到了这一点。SQL Server也基于Sybase,我认为Sybase不支持此功能。语法上有很多限制

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

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

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

另一个选项是强制数据库引擎使用主键索引。您可以使用一个。问题是您需要知道索引的名称。

如果您不知道键是什么,为什么要按它排序?什么数据库支持这种语法?我不熟悉它。@GordonLinoff,因为报告是使用主键生成的。大多数表的构造都考虑了排序。然而,MySQL并没有提供默认的排序顺序,只是默认为如何/何时插入它们。这是正确的;这是ANSI SQL的做事方式。表和结果集表示无序集,除非在最外层显式包含ORDERBY子句。您提到的语法在我所知道的任何数据库中都不存在,因为from子句可以引用多个表。主键有多种选择。@GordonLinoff我在SAP和OpenSQL中使用过它。我相信在连接的情况下,它引用第一个表,但我必须进行验证。现在我正在使用PHP/MySQL来完成这项任务。@GordonLinoff有趣的是,mysqldump似乎有一个-order by primary选项:。只是今天偶然发现。这是行不通的。您可以使用动态SQL执行类似的操作。但一定要记住复合主键。@GordonLinoff复合主键会导致此操作不起作用。。但我只是在本地进行了测试,它执行得很好。我需要使用复合键,但我会把它投给遇到这种情况而不需要复合键的未来用户。@Devon谢谢我回复了+1:查看我的编辑,以获得使用复合键的方法查看SQL,我相信复合解决方案甚至可以用于表没有复合主键-非常棒谢谢你的信息,Gordon,一如既往的有用。在这种方法中,我可能会有不切实际的期望,如果可能的话,只是尝试保存一个额外的查询,但是显示列似乎非常快,所以我可能会继续我的解决方法。
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             |
+--------------------------------------------+
select t.*
from (select t.*
      from table t
     ) t
where <where clause here>;