一些SQL服务器允许一个通用的语句,如ORDER BY PRIMARY KEY
。我不相信这一点适用于MySQL的,是没有这种解决办法将允许跨多个表自动选择还是需要查找查询,以确定主键?
我一直在努力解决方法涉及运行查询之前调用SHOW COLUMNS FROM
。是否有这样做的更有效的方法? MySQL能够确定表中选择过程中的主键?
更新:有一般在MySQL或SQL这样做戈登指出,没有正式的办法。 SAP有它的自定义功能。有变通办法,如用SHOW COLUMNS FROM table
或information_schema
工作约翰指出。
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');
+--------------------------------------------+
| GROUP_CONCAT(`COLUMN_NAME` SEPARATOR ', ') |
+--------------------------------------------+
| firstID, secondID |
+--------------------------------------------+
这是一个评论太长。
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做到这一点。问题是,你需要知道索引的名称。