Elenco dei vincoli dal database MySQL


91

Come ottengo un elenco di tutti i vincoli da un particolare database?


1
C'è più di un tipo di vincolo in MySQL. Cosa intendi? Puoi fare un esempio del tipo di cosa che stai cercando?
Mark Byers

Risposte:


141

Usa la information_schema.table_constraintstabella per ottenere i nomi dei vincoli definiti su ciascuna tabella:

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

Usa la information_schema.key_column_usagetabella per ottenere i campi in ciascuno di questi 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'

1
Questo elenco includerà solo vincoli UNIQUE, PRIMARY KEY o FOREIGN KEY. Il CONTROLLO è possibile, ma non viene applicato. I vincoli DEFAULT non saranno visibili utilizzando questa query.
OMG Ponies

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

1
Il valore DEFAULT non conta come vincolo. È archiviato in information_schema.columns.column_default.
Bill Karwin,

22

Ottima risposta di @Senseful.

Presento una query modificata per coloro che cercano solo un elenco di nomi di vincoli (e non altri dettagli / colonne):

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

2
se avete bisogno di eliminare una volta trovato, vedi qui stackoverflow.com/a/838412/2401804
r3wt

9

Questo aiuta davvero se vuoi vedere i vincoli di chiave primaria ed esterna, nonché le regole intorno a quei vincoli come ON_UPDATE e ON_DELETE e la colonna e i nomi delle colonne esterne 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'

Potresti anche voler aggiungere alcune ulteriori informazioni su quelle colonne, aggiungile semplicemente nell'SQL (e seleziona le colonne che desideri):

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

SELEZIONA * DA USER_CONSTRAINTS WHERE TABLE_NAME = "tabnam";


1
Questo è in Oracle, non in MySQL, per quanto ne so.
Pradyumn
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.