Lista de restrições do banco de dados MySQL

91

Como obtenho uma lista de todas as restrições de um banco de dados específico?

Lolajl
fonte
1
Existe mais de um tipo de restrição no MySQL. O que você quer dizer? Você pode dar um exemplo do tipo de coisa que está procurando?
Mark Byers

Respostas:

141

Use a information_schema.table_constraintstabela para obter os nomes das restrições definidas em cada tabela:

select *
from information_schema.table_constraints
where constraint_schema = 'YOUR_DB'

Use a information_schema.key_column_usagetabela para obter os campos em cada uma dessas restrições:

select *
from information_schema.key_column_usage
where constraint_schema = 'YOUR_DB'

Se, em vez disso, você estiver falando sobre restrições de chave estrangeira, use information_schema.referential_constraints:

select *
from information_schema.referential_constraints
where constraint_schema = 'YOUR_DB'
Sensível
fonte
1
Esta lista incluirá apenas restrições UNIQUE, PRIMARY KEY ou FOREIGN KEY. CHECK é possível, mas não é obrigatório. Restrições DEFAULT não serão visíveis usando esta consulta.
Pôneis OMG
O MySQL não armazena restrições CHECK. Se você tentar definir um, ele o analisa e o descarta silenciosamente.
Bill Karwin
1
O valor DEFAULT não conta como uma restrição. Está armazenado em information_schema.columns.column_default.
Bill Karwin
22

Ótima resposta por @Senseful.

Estou apresentando a consulta modificada para aqueles que procuram apenas a lista de nomes de restrições (e não outros detalhes / colunas):

SELECT DISTINCT(constraint_name) 
FROM information_schema.table_constraints 
WHERE constraint_schema = 'YOUR_DB' 
ORDER BY constraint_name ASC;
Harshith JV
fonte
2
se precisar excluir um assim que encontrá-lo, veja aqui stackoverflow.com/a/838412/2401804
r3wt
9

Isso realmente ajuda se você deseja ver as restrições de chave primária e estrangeira, bem como as regras em torno dessas restrições, como ON_UPDATE e ON_DELETE e os nomes de coluna e coluna estrangeira todos juntos:

SELECT tc.constraint_schema,tc.constraint_name,tc.table_name,tc.constraint_type,kcu.table_name,kcu.column_name,kcu.referenced_table_name,kcu.referenced_column_name,rc.update_rule,rc.delete_rule

FROM information_schema.table_constraints tc

inner JOIN information_schema.key_column_usage kcu
ON tc.constraint_catalog = kcu.constraint_catalog
AND tc.constraint_schema = kcu.constraint_schema
AND tc.constraint_name = kcu.constraint_name
AND tc.table_name = kcu.table_name

LEFT JOIN information_schema.referential_constraints rc
ON tc.constraint_catalog = rc.constraint_catalog
AND tc.constraint_schema = rc.constraint_schema
AND tc.constraint_name = rc.constraint_name
AND tc.table_name = rc.table_name

WHERE tc.constraint_schema = 'my_db_name'

Você pode até querer adicionar mais informações sobre essas colunas, simplesmente adicione-as ao SQL (e selecione as colunas que deseja):

LEFT JOIN information_schema.COLUMNS c
ON kcu.constraint_schema = c.table_schema
AND kcu.table_name = c.table_name
AND kcu.column_name = c.column_name
friek108
fonte
-3

SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME = "tabnam";

EmEsEn
fonte
1
Isso é no Oracle, não no MySQL, até onde eu sei.
Pradyumn