Lista ograniczeń z bazy danych MySQL

92

Jak uzyskać listę wszystkich ograniczeń z określonej bazy danych?

lolajl
źródło
1
W MySQL występuje więcej niż jeden typ ograniczenia. Co masz na myśli? Czy możesz podać przykład tego, czego szukasz?
Mark Byers,

Odpowiedzi:

146

Użyj information_schema.table_constraintstabeli, aby uzyskać nazwy ograniczeń zdefiniowanych w każdej tabeli:

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

Użyj information_schema.key_column_usagetabeli, aby pobrać pola w każdym z tych ograniczeń:

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

Jeśli zamiast tego mówisz o ograniczeniach klucza obcego, użyj information_schema.referential_constraints:

select *
from information_schema.referential_constraints
where constraint_schema = 'YOUR_DB'
Rozsądne
źródło
1
Ta lista będzie zawierać tylko ograniczenia UNIQUE, PRIMARY KEY lub FOREIGN KEY. CHECK jest możliwy, ale nie jest egzekwowany. DEFAULT ograniczenia nie będą widoczne przy użyciu tego zapytania.
Kucyki OMG
MySQL nie przechowuje ograniczeń CHECK. Jeśli spróbujesz zdefiniować jeden, analizuje go i po cichu odrzuca.
Bill Karwin
1
Wartość DEFAULT nie jest liczona jako ograniczenie. Jest przechowywany w information_schema.columns.column_default.
Bill Karwin
22

Świetna odpowiedź od @Senseful.

Przedstawiam zmodyfikowane zapytanie dla tych, którzy szukają tylko listy nazw ograniczeń (a nie innych szczegółów / kolumn):

SELECT DISTINCT(constraint_name) 
FROM information_schema.table_constraints 
WHERE constraint_schema = 'YOUR_DB' 
ORDER BY constraint_name ASC;
Harshith JV
źródło
2
jeśli chcesz go usunąć, gdy już go znajdziesz, zobacz tutaj stackoverflow.com/a/838412/2401804
r3wt
9

To naprawdę pomaga, jeśli chcesz zobaczyć ograniczenia klucza podstawowego i obcego, a także reguły dotyczące tych ograniczeń, takie jak ON_UPDATE i ON_DELETE oraz nazwy kolumn i kolumn obcych razem:

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'

Możesz nawet dodać więcej informacji o tych kolumnach, po prostu dodaj to do SQL (i wybierz żądane kolumny):

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
źródło
-3

SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME = "tabnam";

EmEsEn
źródło
1
O ile wiem, to jest w Oracle, a nie w MySQL.
Pradyumn,