web-dev-qa-db-ja.com

すべてのmysqlテーブル間のすべての関係を見つける方法は?

すべてのMySQLテーブル間のすべての関係を見つける方法は?たとえば、約100個のテーブルがあるデータベースのテーブルの関係を知りたい場合。

とにかくこれを知っていますか?

23
user3148861

プログラム的に言えば、より良い方法は、次のようにINFORMATION_SCHEMA.KEY_COLUMN_USAGEテーブルからデータを収集することです。

SELECT 
  `TABLE_SCHEMA`,                          -- Foreign key schema
  `TABLE_NAME`,                            -- Foreign key table
  `COLUMN_NAME`,                           -- Foreign key column
  `REFERENCED_TABLE_SCHEMA`,               -- Origin key schema
  `REFERENCED_TABLE_NAME`,                 -- Origin key table
  `REFERENCED_COLUMN_NAME`                 -- Origin key column
FROM
  `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE`  -- Will fail if user don't have privilege
WHERE
  `TABLE_SCHEMA` = SCHEMA()                -- Detect current schema in USE 
  AND `REFERENCED_TABLE_NAME` IS NOT NULL; -- Only tables with foreign keys

ORDINAL_POSITIONなど、目的に応じて役立つ列情報がさらにあります。

詳細:http://dev.mysql.com/doc/refman/5.1/en/key-column-usage-table .html

36
xudre

これを試して:

select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS;
15
BaBL86

試して

選択
`TABLE_NAME`、
`COLUMN_NAME`、
`REFERENCED_TABLE_NAME`、
`REFERENCED_COLUMN_NAME`
FROM `information_schema`.`KEY_COLUMN_USAGE`
WHERE `CONSTRAINT_SCHEMA` = 'YOUR_DATABASE_NAME' AND
`REFERENCED_TABLE_SCHEMA` IS NOT NULL AND
`REFERENCED_TABLE_NAME` IS NOT NULL AND
`REFERENCED_COLUMN_NAME` IS NOT NULL

yOUR_DATABASE_NAMEをデータベース名に置き換えることを忘れないでください!

8
Mostafa Lavaei

MySQLで関係を視覚化する簡単な方法は、 MySQL Workbench を使用してデータベースをリバースエンジニアリングすることです。

これは、リバースエンジニアリングを使用して行うこともできます。これにより、次のようなエンティティ関係図が作成されます(ただし、生成されたら、自分で整理する必要があります)。

ERD

6
Fanta Sylla

SELECT 
    count(1) totalrelationships ,
    c.table_name tablename,
    CONCAT(' ',GROUP_CONCAT(c.column_name ORDER BY ordinal_position SEPARATOR ', ')) columnname,
    CONCAT(' ',GROUP_CONCAT(c.column_type ORDER BY ordinal_position SEPARATOR ', ')) columntype    
FROM
    information_schema.columns c RIGHT JOIN
    (SELECT column_name , column_type FROM information_schema.columns WHERE 
    -- column_key in ('PRI','MUL') AND  -- uncomment this line if you want to see relations only with indexes
    table_schema = DATABASE() AND table_name = 'YourTableName') AS p
    USING (column_name,column_type)
WHERE
    c.table_schema = DATABASE()
    -- AND c.table_name != 'YourTableName'
    GROUP BY tablename
    -- HAVING (locate(' YourColumnName',columnname) > 0) -- uncomment this line to search for specific column 
    ORDER BY totalrelationships desc, columnname
;
4

次を使用できます。

SHOW CREATE TABLE table_name;
2
balderys

1)データベースに移動します:
use DATABASE;

2)すべてのテーブルを表示する:
show tables;

3)テーブルの各列を見て、テーブルの機能と構成要素を収集します。
describe TABLENAME;

4)テーブルの列が何をするのかを正確に把握できるので、説明するのは良いことですが、データ自体をさらに詳しく調べたい場合は、select * from TABLENAME
大きなテーブルがある場合、通常、各行にはidがあります。この場合、数行のデータを取得し、端末が圧倒されないようにするためにこれを実行します。
select * from TABLENAME where id<5-任意の条件をここに入れることができます。

このメソッドは、select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS;を実行するだけでなく、より多くの情報を提供します。また、毎回、より大きなサイズの情報を提供します。

[〜#〜] edit [〜#〜]

コメントが示唆したように、上記のWHERE id < 5は条件付きプレースホルダーとして悪い選択でした。特にIDは通常、連続していることが信頼できないため、ID番号で制限することはお勧めできません。代わりに、クエリの最後にLIMIT 5を追加してください。

1
Roman

1つのオプションは次のとおりです。リバースエンジニアリングを実行して、図式的に理解することができます。

MySQLをインストールすると、MySQLWorkbenchが取得されます。それを開き、リバースエンジニアリングするデータベースを選択する必要があります。ツールまたはデータベースメニューのどこかにあるリバースエンジニアリングオプションをクリックします。テーブルを選択するように求められます。理解するテーブルを選択するか、DB全体を選択します。リレーションシップを持つダイアグラムを生成します。

0
user3655708