MySQL的按主键

问题描述 投票:8回答:2

一些SQL服务器允许一个通用的语句,如ORDER BY PRIMARY KEY。我不相信这一点适用于MySQL的,是没有这种解决办法将允许跨多个表自动选择还是需要查找查询,以确定主键?

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

更新:有一般在MySQL或SQL这样做戈登指出,没有正式的办法。 SAP有它的自定义功能。有变通办法,如用SHOW COLUMNS FROM tableinformation_schema工作约翰指出。

mysql sql sql-order-by primary-key
2个回答
8
投票

MySQL的一般由这将是按主键插入顺序提取数据出来,但抛开你可以在技术上做同样的事情,如果你拉出来的主键列名,并把它放在一个ORDER BY

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用户有权访问这些表的权利,但只能看到对应于该用户具有适当的访问权限的对象表中的行。在某些情况下(例如,在INFORMATION_SCHEMA.ROUTINES表中的列ROUTINE_DEFINITION),谁没有足够权限的用户看空。这些限制并不适用于InnoDB表;你可以看到他们只用process权限。

同样的权限适用于从INFORMATION_SCHEMA选择信息并看穿SHOW语句相同的信息。在这两种情况下,你必须有一个对象的某些特权看到关于它的信息。

设定:

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

查询:

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

OUTPUT:

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

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做到这一点。问题是,你需要知道索引的名称。

© www.soinside.com 2019 - 2024. All rights reserved.