2010-06-11 4 views
61

Wie bekomme ich eine Liste aller Einschränkungen aus einer bestimmten Datenbank?Liste der Einschränkungen von MySQL-Datenbank

+0

In MySQL gibt es mehr als einen Constraint-Typ. Was meinst du? Können Sie ein Beispiel für die Art von Dingen geben, nach denen Sie suchen? –

Antwort

102

Verwenden Sie die information_schema.table_constraints Tabelle die Namen der Einschränkungen für jede Tabelle definiert zu erhalten:

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

Verwenden Sie die information_schema.key_column_usage Tabelle werden die Felder in jedem dieser Zwänge zu bekommen:

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

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

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

Diese Liste enthält nur UNIQUE-, PRIMARY KEY- oder FOREIGN KEY-Einschränkungen. CHECK ist möglich, wird aber nicht erzwungen. DEFAULT-Einschränkungen sind mit dieser Abfrage nicht sichtbar. –

+0

MySQL speichert CHECK-Einschränkungen nicht. Wenn Sie versuchen, einen zu definieren, parst er ihn und verwirft ihn stillschweigend. –

+1

Der DEFAULT-Wert zählt nicht als Einschränkung. Es ist in 'information_schema.columns.column_default' gespeichert. –

16

Große Antwort von @Senseful.

ich modifizierte Abfrage für die vorstelle, die nur für die Liste der Constraint-Namen suchen (und nicht andere Details/Spalten):

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

Wenn Sie einen löschen müssen, sobald Sie ihn gefunden haben, finden Sie hier http://StackOverflow.com/a/838412/2401804 – r3wt

-2

SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME = "TABNAM"; Das hilft wirklich

0

wenn Sie Primär- und Fremdschlüssel-Constraints sowie Regeln rund um diese Einschränkungen wie ON_UPDATE und ON_DELETE und die Spalte und ausländischen Spaltennamen alle zusammen sehen wollen:

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' 

Sie selbst möchten Um weitere Informationen zu diesen Spalten hinzuzufügen, fügen Sie diese einfach in das 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 
Verwandte Themen