2010-06-11 5 views
61

Come si ottiene un elenco di tutti i vincoli da un determinato database?Elenco dei vincoli dal database MySQL

+0

C'è più di un tipo di vincolo in MySQL. Che intendi? Puoi dare un esempio del tipo di cosa che stai cercando? –

risposta

102

Utilizzare la tabella di information_schema.table_constraints per ottenere i nomi dei vincoli definiti su ogni tavolo:

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

Utilizzare la tabella information_schema.key_column_usage per ottenere i campi in ogni uno di quei vincoli:

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

Se invece stai parlando di vincoli di chiave esterna, usa information_schema.referential_constraints:

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

Questo elenco includerà solo vincoli UNIQUE, KEY PRIMARY o FOREIGN KEY. CHECK è possibile, ma non viene applicato. I vincoli DEFAULT non saranno visibili utilizzando questa query. –

+0

MySQL non memorizza i vincoli CHECK. Se provi a definirne uno, lo analizza e lo scarta silenziosamente. –

+1

Il valore DEFAULT non viene considerato come un vincolo. È memorizzato in 'information_schema.columns.column_default'. –

16

Grande risposta di @Senseful.

che vi presento query modificata per coloro che sono solo alla ricerca di elenco di nomi di vincolo (e non altri dettagli/colonne):

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

se devi cancellarne uno una volta lo trovi, vedi qui http://stackoverflow.com/a/838412/2401804 – r3wt

-2

SELECT * FROM WHERE user_constraints TABLE_NAME = "tabnam";

0

Questo aiuta veramente se volete vedere vincoli di chiave primaria e stranieri, nonché le norme intorno a tali vincoli, come ON_UPDATE e ON_DELETE ed i nomi di colonna e colonna stranieri tutti insieme:

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' 

Si potrebbe anche voler per aggiungere ulteriori informazioni su tali colonne, è sufficiente aggiungerle nell'SQL (e selezionare le colonne desiderate):

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