Mostrar restrições no comando de tabelas

224

Tenho tabelas nas quais tentei definir relacionamentos PK FK, mas desejo verificar isso. Como posso mostrar as restrições de PK / FK? Vi esta página de manual, mas ela não mostra exemplos e minha pesquisa no google também foi infrutífera. Meu banco de dados é credentialing1e minhas tabelas restritas são practicese cred_insurances.

Capitão Claptrap
fonte

Respostas:

414

eu uso

SHOW CREATE TABLE mytable;

Isso mostra a instrução SQL necessária para recriar mytableem sua forma atual. Você pode ver todas as colunas e seus tipos (como DESC), mas também mostra informações sobre restrições (e tipo de tabela, conjunto de caracteres, etc.).

Adrian Smith
fonte
8
Eu não acho que mostra as relações fk recebidas? como em por exemplo, a.col_one references b.col_onee em show create table bnão conterá detalhes sobre a relação mencionada acima.
Vineet Menon 10/10
1
Confirmei que este comando não exibe a restrição de chave estrangeira.
Kemin Zhou
2
Cuidado que o MariaDB, começando com 10.2, retornará resultados estranhos aqui. jira.mariadb.org/browse/MDEV-15377
stamster
117

Basta consultar o 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
fonte
14
Essa é a melhor resposta, pois fornece o resultado em um formato que você pode usar programaticamente. Claro que você precisará adicionar uma cláusula WHERE para restringir os resultados
Naveed Hasan
Isso me ajudou a encontrar uma tabela corrompida que tinha a coluna 'id' referenciando várias chaves estrangeiras. Não é de admirar que a tabela tenha 1452 IntegrityError.
Vicky T
Esta é uma ótima resposta! Obrigado @ Resh32
simhumileco
Eu amo que você prefixou sua resposta com "Simplesmente". Ótima resposta, no entanto!
leviathanbadger
Isso não vai exibir regras de restrição reais - por exemploON UPDATE CASCADE
stamster
19

O principal problema com a resposta validada é que você precisará analisar a saída para obter as informações. Aqui está uma consulta que permite obtê-los de uma maneira mais utilizável:

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

afaik para fazer uma solicitação para information_schemavocê precisar de privilégios. Se você precisar de uma lista simples de chaves, poderá usar este comando:

SHOW INDEXES IN <tablename>
pleerock
fonte
Como está chamando information_schema é melhor do que isso, graças a lot
Eiad Samman
6

Tente fazer:

SHOW TABLE STATUS FROM credentialing1;

As restrições de chave estrangeira estão listadas na coluna Comentário da saída.

codaddict
fonte
3
Eu vejo apenas comentários da tabela na coluna Comentário. Provavelmente é algo a ver com os tipos InnoDB.
clockworkgeek
1
Os comentários são apenas para comentários do usuário. Com certeza esse não é o lugar onde as definições de FK estão armazenadas! Se eles são para você - deve ter sido feito em seu nome por alguma ferramenta RDBMS.
Stamster
6

Você pode usar isto:

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, para obter uma saída melhor formatada, use o seguinte:

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
fonte
ORA-00942: tabela ou exibição não existe 00942. 00000 - "tabela ou exibição não existe" * Causa: * Ação: Erro na linha: 29 Coluna: 5 A linha 29 é "information_schema.key_column_usage"
limites
2
@noboundaries você está tentando que em Oracle, a pergunta é sobre MySQL
ymajoros
1

Análogo a @ Resh32 , mas sem a necessidade de usar a USEinstrução:

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 exemplo, usando o ORM.

simhumileco
fonte
Isso não vai exibir regras de restrição reais - por exemploON UPDATE CASCADE
stamster
0

Existe também uma ferramenta que o oracle fez chamada mysqlshow

Se você executá-lo com a --k keys $table_nameopção, ele exibirá as teclas.

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

exemplo:

╰─➤  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      |         |               |
+--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
JardimRouteGold
fonte