Come si ottiene un elenco di tutti i vincoli da un determinato database?Elenco dei vincoli dal database MySQL
risposta
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'
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. –
MySQL non memorizza i vincoli CHECK. Se provi a definirne uno, lo analizza e lo scarta silenziosamente. –
Il valore DEFAULT non viene considerato come un vincolo. È memorizzato in 'information_schema.columns.column_default'. –
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;
se devi cancellarne uno una volta lo trovi, vedi qui http://stackoverflow.com/a/838412/2401804 – r3wt
SELECT * FROM WHERE user_constraints TABLE_NAME = "tabnam";
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
C'è più di un tipo di vincolo in MySQL. Che intendi? Puoi dare un esempio del tipo di cosa che stai cercando? –