performant MySQLテーブルに割り当てられた外部キーのリストを取得する方法はありますか?MySQLテーブルの外部キーをリストする実行方法
SELECT
`column_name`,
`referenced_table_schema` AS foreign_db,
`referenced_table_name` AS foreign_table,
`referenced_column_name` AS foreign_column
FROM
`information_schema`.`KEY_COLUMN_USAGE`
WHERE
`constraint_schema` = SCHEMA()
AND
`table_name` = 'your-table-name-here'
AND
`referenced_column_name` IS NOT NULL
ORDER BY
`column_name`;
作品との情報スキーマの照会、しかし、私はそれを試してみたのMySQLのバージョンで痛々しいほど遅いです。研究の一部がthis bugとなっています。これは明らかな解決策がないまま進行中の問題であることを示しているようです。私が取り組んでいるプロジェクトではうまくいかないパッチでmysqlを再構成または再コンパイルする必要があります。
私はそれは、次の
SHOW CREATE TABLE table_name;
を発行し、外部キー制約が含まれますCREATE TABLE文の文字列表現を取得することが可能です実現。しかし、この文字列を解析するのは壊れやすいようですが、テストするCREATE TABLE文のコーパスが大量にありません。
を(が、このためのコードを解析する標準ビットがありますならば、私はいくつかのリンクをみたい)私も、私は、インデックスのリストが含まれます、次の
SHOW CREATE TABLE table_name;
でインデックスを一覧表示することができます実現外部キーであるが、どちらのインデックスが外部キーであり、どれが「通常の」MySQLインデックスであるかを判断する方法はないようである。ここでも、SHOW CREATEテーブル情報を使ったいくつかの相互参照が役に立ちましたが、それは壊れやすい文字列解析に戻ってしまいます。
この問題に関するその他のスマートな議論への助けや、他のスマートな議論へのリンクさえも高く評価されます。
私は、テーブルの外部キー部分のための簡単なパーサーを書くのが壊れやすい理由はわかりません... create tableの構文はmysqlのドキュメントで明確に定義されています... – Zak
私はなぜパフォーマンスが良いのですか?このようなクエリでは問題になります。データベース構造を1秒間に50回調べるのではなく、そうした場合、アプリケーションにひどい問題があります。 – GolezTrol
@Zakそれは哲学的なことですが、私はそれが最終的に私がする必要があると考えています。私は、ドキュメントでカバーされていないエッジケースには気をつけています。私は、SHOW CREATE TABLE構文が有効な構文ではないものを返すかもしれないmysqlバージョンを気にしています。最初。 –