Mostrar restricciones en el comando de tablas

224

Tengo tablas en las que he intentado establecer relaciones PK FK pero quiero verificar esto. ¿Cómo puedo mostrar las restricciones PK / FK? Vi esta página del manual, pero no muestra ejemplos y mi búsqueda en Google también fue infructuosa. Mi base de datos es credentialing1y mis tablas restringidas son practicesy cred_insurances.

Capitán Claptrap
fuente

Respuestas:

414

yo suelo

SHOW CREATE TABLE mytable;

Esto le muestra la instrucción SQL necesaria para receate mytableen su forma actual. Puede ver todas las columnas y sus tipos (como DESC), pero también muestra información de restricción (y tipo de tabla, juego de caracteres, etc.).

Adrian Smith
fuente
8
no creo que muestre las relaciones fk entrantes? como en por ejemplo, a.col_one references b.col_oney show create table bno contendrá detalles sobre la relación mencionada anteriormente.
Vineet Menon
1
Confirmé que este comando no muestra la restricción de clave externa.
Kemin Zhou
2
Tenga en cuenta que MariaDB que comienza con 10.2 devolverá resultados incómodos aquí. jira.mariadb.org/browse/MDEV-15377
stamster
117

Simplemente consulta el 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
fuente
14
Esta es la mejor respuesta porque le da el resultado en un formato que puede usar mediante programación. Por supuesto, tendrá que agregar una cláusula WHERE para reducir los resultados
Naveed Hasan
Esto me ayudó a encontrar una tabla corrupta que tuviera la columna 'id' haciendo referencia a varias claves foráneas. No es de extrañar que la tabla tenga 1452 IntegrityError.
Vicky T
Esta es una gran respuesta! Gracias @ Resh32
simhumileco
Me encanta que prefijaste tu respuesta con "Simplemente". ¡Gran respuesta, sin embargo!
leviathanbadger
Eso no mostrará las reglas de restricción reales, por ejemploON UPDATE CASCADE
stamster
19

El principal problema con la respuesta validada es que tendrá que analizar la salida para obtener la información. Aquí hay una consulta que le permite obtenerlos de una manera más útil:

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
fuente
11

afaik para hacerle una solicitud information_schemanecesita privilegios. Si necesita una lista simple de teclas, puede usar este comando:

SHOW INDEXES IN <tablename>
pleerock
fuente
Cómo es mejor llamar a information_schema que esto, muchas gracias
Eiad Samman
6

Trata de hacerlo:

SHOW TABLE STATUS FROM credentialing1;

Las restricciones de clave externa se enumeran en la columna Comentario de la salida.

codictorio
fuente
3
Solo veo comentarios de tabla en la columna Comentario. Probablemente tenga algo que ver con los tipos InnoDB.
clockworkgeek
1
Los comentarios son solo para comentarios de los usuarios. ¡Ese no es el lugar donde se almacenan las definiciones de FK! Si son para usted, debe haberlo hecho en su nombre alguna herramienta RDBMS.
stamster
6

Puedes usar esto:

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'

O para una salida mejor formateada use esto:

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
fuente
ORA-00942: la tabla o vista no existe 00942. 00000 - "la tabla o vista no existe" * Causa: * Acción: Error en la línea: 29 Columna: 5 La línea 29 es "information_schema.key_column_usage"
límites
2
@noboundaries que está tratando de que en Oracle, la pregunta es sobre MySQL
ymajoros
1

Análogo a @ Resh32 , pero sin la necesidad de usar la USEdeclaración:

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;

Útil, por ejemplo, usando el ORM.

simhumileco
fuente
Eso no mostrará las reglas de restricción reales, por ejemploON UPDATE CASCADE
stamster
0

También hay una herramienta que hizo Oracle llamada mysqlshow

Si lo ejecuta con la --k keys $table_nameopción, mostrará las teclas.

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

ejemplo:

╰─➤  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      |         |               |
+--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
JardínRutaOro
fuente