一部のSQLサーバーでは、などの一般的なステートメントを使用できますORDER BY PRIMARY KEY
。これがMySQLで機能するとは思わないのですが、複数のテーブル間で自動選択を可能にするような回避策はありますか、それとも主キーを決定するためにルックアップクエリが必要ですか?
私が取り組んできた回避策にはSHOW COLUMNS FROM
、クエリを実行する前にaを呼び出すことが含まれます。これを行うためのより効率的な方法はありますか?MySQLは、選択プロセス中にテーブルの主キーを判別できますか?
更新: Gordonが指摘したように、MySQLまたはSQLでこれを行う公式の方法は一般的にありません。SAPにはカスタム機能があります。ジョンが指摘しSHOW COLUMNS FROM table
たinformation_schema
ように、またはで作業するなどの回避策があります。
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ユーザーにはこれらのテーブルにアクセスする権利がありますが、ユーザーが適切なアクセス権限を持っているオブジェクトに対応するテーブル内の行のみを表示できます。場合によっては(たとえば、INFORMATION_SCHEMA.ROUTINESテーブルのROUTINE_DEFINITION列)、権限が不十分なユーザーにはNULLが表示されます。これらの制限は、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 |
+--------------------------------------------+
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加