web-dev-qa-db-fra.com

Comment retrouver toutes les relations entre toutes les tables mysql?

Comment retrouver toutes les relations entre toutes les tables MySQL? Si par exemple, je veux connaître la relation des tables dans une base de données d'environ 100 tables.

Y a-t-il un moyen de le savoir?

23
user3148861

La meilleure façon, par programme, est de collecter les données du INFORMATION_SCHEMA.KEY_COLUMN_USAGE table comme suit:

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

Il y a plus d'informations sur les colonnes comme ORDINAL_POSITION qui pourraient être utiles en fonction de votre objectif.

Plus d'informations: http://dev.mysql.com/doc/refman/5.1/en/key-column-usage-table .html

36
xudre

Essaye ça:

select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS;
15
BaBL86

Essayer

SÉLECTIONNER
`TABLE_NAME`,
`COLUMN_NAME`,
`REFERENCED_TABLE_NAME`,
`REFERENCED_COLUMN_NAME`
DE `information_schema`.`KEY_COLUMN_USAGE`
OERE `CONSTRAINT_SCHEMA` = 'VOTRE_NOM_DATABASE' ET
`REFERENCED_TABLE_SCHEMA` IS NOT NULL AND
`REFERENCED_TABLE_NAME` IS NOT NULL AND
`REFERENCED_COLUMN_NAME` IS NOT NULL

n'oubliez pas de remplacer YOUR_DATABASE_NAME par le nom de votre base de données!

8
Mostafa Lavaei

Une méthode rapide pour visualiser les relations dans MySQL consiste à effectuer une rétro-ingénierie de la base de données avec MySQL Workbench .

Cela peut également être fait en utilisant l'ingénierie inverse, ce qui entraînera un diagramme de relation d'entité semblable au suivant (bien que vous deviez peut-être l'organiser vous-même, une fois qu'il est généré):

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
Ricardo Sismeiro

vous pouvez utiliser:

SHOW CREATE TABLE table_name;
2
balderys

1) Allez dans votre base de données:
use DATABASE;

2) Affichez tous les tableaux:
show tables;

3) Regardez chaque colonne du tableau pour rassembler ce qu'il fait et ce qu'il est fait:
describe TABLENAME;

4) Décrire, c'est bien car vous pouvez comprendre exactement ce que font vos colonnes de table, mais si vous souhaitez regarder de plus près les données elles-mêmes: select * from TABLENAME
Si vous avez de grandes tables, alors chaque ligne a généralement un id, auquel cas j'aime le faire pour obtenir juste quelques lignes de données et ne pas avoir le terminal débordé:
select * from TABLENAME where id<5 - Vous pouvez mettre ici n'importe quelle condition.

Cette méthode vous donne plus d'informations que simplement select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS;, et il vous fournit également à chaque fois des informations plus petites.

MODIFIER

Comme le suggéraient les commentaires, ce qui précède WHERE id < 5 était un mauvais choix comme espace réservé conditionnel. Ce n'est pas une bonne idée de limiter par numéro d'identification, d'autant plus que l'identifiant n'est généralement pas digne de confiance pour être séquentiel. Ajouter LIMIT 5 à la fin de la requête.

1
Roman

Une option est: vous pouvez faire de l'ingénierie inverse pour le comprendre de manière schématique.

Lorsque vous installez MySQL, vous obtiendrez MySQLWorkbench. Vous devez l'ouvrir et choisir la base de données que vous souhaitez inverser. Cliquez sur l'option Reverse engineering quelque part que vous trouverez sous le menu Outils ou Base de données. Il vous demandera de choisir les tables. Soit vous sélectionnez les tables que vous souhaitez comprendre, soit vous choisissez la base de données entière. Il va générer un diagramme avec des relations.

0
user3655708