Liste der Einschränkungen aus der MySQL-Datenbank


90

Wie erhalte ich eine Liste aller Einschränkungen aus einer bestimmten Datenbank?


1
In MySQL gibt es mehr als eine Art von Einschränkung. Was meinst du? Können Sie ein Beispiel geben, wonach Sie suchen?
Mark Byers

Antworten:


140

Verwenden Sie die information_schema.table_constraintsTabelle, um die Namen der für jede Tabelle definierten Einschränkungen abzurufen:

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

Verwenden Sie die information_schema.key_column_usageTabelle, um die Felder in jeder dieser Einschränkungen abzurufen:

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

Wenn Sie stattdessen über Fremdschlüsseleinschränkungen sprechen, verwenden Sie information_schema.referential_constraints:

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

1
Diese Liste enthält nur Einschränkungen für EINZIGARTIGE, PRIMÄRE SCHLÜSSEL oder AUSLÄNDISCHE SCHLÜSSEL. CHECK ist möglich, wird aber nicht erzwungen. DEFAULT-Einschränkungen werden bei dieser Abfrage nicht angezeigt.
OMG Ponys

MySQL speichert keine CHECK-Einschränkungen. Wenn Sie versuchen, eine zu definieren, wird diese analysiert und stillschweigend verworfen.
Bill Karwin

1
Der DEFAULT-Wert zählt nicht als Einschränkung. Es ist in gespeichert information_schema.columns.column_default.
Bill Karwin

21

Tolle Antwort von @Senseful.

Ich präsentiere eine modifizierte Abfrage für diejenigen, die nur nach einer Liste von Einschränkungsnamen (und nicht nach anderen Details / Spalten) suchen:

SELECT DISTINCT(constraint_name) 
FROM information_schema.table_constraints 
WHERE constraint_schema = 'YOUR_DB' 
ORDER BY constraint_name ASC;

2
Wenn Sie eine löschen müssen, sobald Sie sie gefunden haben, finden Sie hier stackoverflow.com/a/838412/2401804
r3wt

8

Dies ist sehr hilfreich, wenn Sie Primär- und Fremdschlüsseleinschränkungen sowie Regeln für diese Einschränkungen wie ON_UPDATE und ON_DELETE sowie die Spalten- und Fremdspaltennamen anzeigen möchten:

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'

Möglicherweise möchten Sie sogar weitere Informationen zu diesen Spalten hinzufügen. Fügen Sie diese einfach in SQL ein (und wählen Sie die gewünschten Spalten aus):

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
Soweit ich weiß, ist dies in Oracle und nicht in MySQL.
Pradyumn
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.