Lista ograniczeń z bazy danych MySQL


92

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


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'

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;

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

-3

SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME = "tabnam";


1
O ile wiem, to jest w Oracle, a nie w MySQL.
— Pradyumn,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.