Afficher les contraintes sur les tables, commande

224

J'ai des tables sur lesquelles j'ai essayé de définir des relations PK FK, mais je veux vérifier cela. Comment afficher les restrictions PK / FK? J'ai vu cette page de manuel, mais elle ne montre pas d'exemples et ma recherche Google a également été infructueuse. Ma base de données est credentialing1et mes tables contraintes sont practiceset cred_insurances.

Capitaine Claptrap
la source

Réponses:

414

j'utilise

SHOW CREATE TABLE mytable;

Cela vous montre l'instruction SQL nécessaire pour recréer mytabledans sa forme actuelle. Vous pouvez voir toutes les colonnes et leurs types (comme DESC), mais cela vous montre également les informations sur les contraintes (et le type de table, le jeu de caractères, etc.).

Adrian Smith
la source
8
je ne pense pas qu'il montre les relations fk entrantes? comme dans par exemple, a.col_one references b.col_oneet dans show create table bne contiendra pas de détails sur la relation susmentionnée.
Vineet Menon
1
J'ai confirmé que cette commande n'affiche pas la contrainte de clé étrangère.
Kemin Zhou
2
Sachez que MariaDB commençant par 10.2 renverra ici des résultats maladroits. jira.mariadb.org/browse/MDEV-15377
stamster
117

Recherchez simplement INFORMATION_SCHEMA:

USE INFORMATION_SCHEMA;
SELECT TABLE_NAME,
       COLUMN_NAME,
       CONSTRAINT_NAME,
       REFERENCED_TABLE_NAME,
       REFERENCED_COLUMN_NAME
FROM KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = "<your_database_name>" 
      AND TABLE_NAME = "<your_table_name>" 
      AND REFERENCED_COLUMN_NAME IS NOT NULL;
Resh32
la source
14
C'est la meilleure réponse car elle vous donne le résultat dans un format que vous pouvez utiliser par programme. Bien sûr, vous devrez ajouter une clause WHERE pour affiner les résultats
Naveed Hasan
Cela m'a aidé à trouver une table corrompue dont la colonne 'id' faisait référence à plusieurs clés étrangères. Pas étonnant que la table ait obtenu 1452 IntegrityError.
Vicky T
C'est une excellente réponse! Merci @ Resh32
simhumileco
J'adore que vous ayez préfixé votre réponse par "Simplement". Excellente réponse, cependant!
leviathanbadger
Cela n'affichera pas les règles de contrainte réelles - par exempleON UPDATE CASCADE
stamster
19

Le principal problème avec la réponse validée est que vous devrez analyser la sortie pour obtenir les informations. Voici une requête vous permettant de les obtenir de manière plus utilisable:

SELECT cols.TABLE_NAME, cols.COLUMN_NAME, cols.ORDINAL_POSITION,
cols.COLUMN_DEFAULT, cols.IS_NULLABLE, cols.DATA_TYPE,
    cols.CHARACTER_MAXIMUM_LENGTH, cols.CHARACTER_OCTET_LENGTH,
    cols.NUMERIC_PRECISION, cols.NUMERIC_SCALE,
    cols.COLUMN_TYPE, cols.COLUMN_KEY, cols.EXTRA,
    cols.COLUMN_COMMENT, refs.REFERENCED_TABLE_NAME, refs.REFERENCED_COLUMN_NAME,
    cRefs.UPDATE_RULE, cRefs.DELETE_RULE,
    links.TABLE_NAME, links.COLUMN_NAME,
    cLinks.UPDATE_RULE, cLinks.DELETE_RULE
FROM INFORMATION_SCHEMA.`COLUMNS` as cols
LEFT JOIN INFORMATION_SCHEMA.`KEY_COLUMN_USAGE` AS refs
ON refs.TABLE_SCHEMA=cols.TABLE_SCHEMA
    AND refs.REFERENCED_TABLE_SCHEMA=cols.TABLE_SCHEMA
    AND refs.TABLE_NAME=cols.TABLE_NAME
    AND refs.COLUMN_NAME=cols.COLUMN_NAME
LEFT JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS cRefs
ON cRefs.CONSTRAINT_SCHEMA=cols.TABLE_SCHEMA
    AND cRefs.CONSTRAINT_NAME=refs.CONSTRAINT_NAME
LEFT JOIN INFORMATION_SCHEMA.`KEY_COLUMN_USAGE` AS links
ON links.TABLE_SCHEMA=cols.TABLE_SCHEMA
    AND links.REFERENCED_TABLE_SCHEMA=cols.TABLE_SCHEMA
    AND links.REFERENCED_TABLE_NAME=cols.TABLE_NAME
    AND links.REFERENCED_COLUMN_NAME=cols.COLUMN_NAME
LEFT JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS cLinks
ON cLinks.CONSTRAINT_SCHEMA=cols.TABLE_SCHEMA
    AND cLinks.CONSTRAINT_NAME=links.CONSTRAINT_NAME
WHERE cols.TABLE_SCHEMA=DATABASE()
    AND cols.TABLE_NAME="table"
nfroidure
la source
11

afaik pour vous faire une demande a information_schemabesoin de privilèges. Si vous avez besoin d'une simple liste de clés, vous pouvez utiliser cette commande:

SHOW INDEXES IN <tablename>
pleerock
la source
Comment appeler information_schema est mieux que cela, merci beaucoup
Eiad Samman
6

Essayez de faire:

SHOW TABLE STATUS FROM credentialing1;

Les contraintes de clé étrangère sont répertoriées dans la colonne Commentaire de la sortie.

codaddict
la source
3
Je ne vois que les commentaires du tableau dans la colonne Commentaire. C'est probablement quelque chose à voir avec les types InnoDB.
clockworkgeek
1
Les commentaires sont uniquement destinés aux commentaires des utilisateurs. Ce n'est certainement pas l'endroit où les définitions FK sont stockées! S'ils sont pour vous - cela doit avoir été fait en votre nom par un outil SGBDR.
stamster
6

Vous pouvez utiliser ceci:

select
    table_name,column_name,referenced_table_name,referenced_column_name
from
    information_schema.key_column_usage
where
    referenced_table_name is not null
    and table_schema = 'my_database' 
    and table_name = 'my_table'

Ou pour une sortie mieux formatée, utilisez ceci:

select
    concat(table_name, '.', column_name) as 'foreign key',  
    concat(referenced_table_name, '.', referenced_column_name) as 'references'
from
    information_schema.key_column_usage
where
    referenced_table_name is not null
    and table_schema = 'my_database' 
    and table_name = 'my_table'
Abhishek Gupta
la source
ORA-00942: la table ou la vue n'existe pas 00942. 00000 - "la table ou la vue n'existe pas" * Cause: * Action: Erreur à la ligne: 29 Colonne: 5 La ligne 29 est "information_schema.key_column_usage"
noboundaries
2
@noboundaries vous essayez cela sur Oracle, la question concerne MySQL
ymajoros
1

Analogue à @ Resh32 , mais sans avoir besoin d'utiliser l' USEinstruction:

SELECT TABLE_NAME,
       COLUMN_NAME,
       CONSTRAINT_NAME,
       REFERENCED_TABLE_NAME,
       REFERENCED_COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = "database_name" 
      AND TABLE_NAME = "table_name" 
      AND REFERENCED_COLUMN_NAME IS NOT NULL;

Utile, par exemple en utilisant l'ORM.

simhumileco
la source
Cela n'affichera pas les règles de contrainte réelles - par exempleON UPDATE CASCADE
stamster
0

Il y a aussi un outil créé par Oracle appelé mysqlshow

Si vous l'exécutez avec l' --k keys $table_nameoption, il affichera les clés.

SYNOPSIS
   mysqlshow [options] [db_name [tbl_name [col_name]]]
.......
.......
.......
·   --keys, -k
   Show table indexes.

exemple:

╰─➤  mysqlshow -h 127.0.0.1 -u root -p --keys database tokens
Database: database  Table: tokens
+-----------------+------------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
| Field           | Type             | Collation          | Null | Key | Default | Extra          | Privileges                      | Comment |
+-----------------+------------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
| id              | int(10) unsigned |                    | NO   | PRI |         | auto_increment | select,insert,update,references |         |
| token           | text             | utf8mb4_unicode_ci | NO   |     |         |                | select,insert,update,references |         |
| user_id         | int(10) unsigned |                    | NO   | MUL |         |                | select,insert,update,references |         |
| expires_in      | datetime         |                    | YES  |     |         |                | select,insert,update,references |         |
| created_at      | timestamp        |                    | YES  |     |         |                | select,insert,update,references |         |
| updated_at      | timestamp        |                    | YES  |     |         |                | select,insert,update,references |         |
+-----------------+------------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
+--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table  | Non_unique | Key_name                 | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| tokens | 0          | PRIMARY                  | 1            | id          | A         | 2           |          |        |      | BTREE      |         |               |
| tokens | 1          | tokens_user_id_foreign   | 1            | user_id     | A         | 2           |          |        |      | BTREE      |         |               |
+--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
GardenRouteGold
la source