Problema:
Vuoi conoscere i nomi predefiniti dei vincoli in una tabella in MySQL.
Esempio:
Nel nostro database creiamo due tabelle, country
e student
, con i seguenti vincoli:PRIMARY KEY
(l'id della colonna nelle tabelle country
e student
), FOREIGN KEY
(la colonna country_id
nella tabella student
), DEFAULT
(il nome della colonna nella tabella student
), UNIQUE
(la colonna name
nella tabella country
e la colonna personal_number
nella tabella student
), e CHECK
(la colonna age
nella tabella student
).
Soluzione:
CREATE TABLE country ( id int NOT NULL primary key, name varchar(100) UNIQUE ); CREATE TABLE student ( id int NOT NULL primary key, name varchar(100) NOT NULL DEFAULT 'unknown', personal_number varchar(100) UNIQUE, age int CHECK(age>15), country_id int, FOREIGN KEY(country_id) REFERENCES country(id) );
Mostriamo come MySQL denomina i vincoli di queste tabelle per impostazione predefinita. Usa questa query per vederli:
SELECT TABLE_NAME, CONSTRAINT_TYPE, CONSTRAINT_NAME FROM information_schema.table_constraints WHERE table_name='country' OR table_name='student';
Ecco il risultato:
TABLE_NAME | TIPO_VINCENTE | CONSTRAINT_NAME |
---|---|---|
paese | CHIAVE PRIMARIA | PRIMARIO |
paese | UNICO | nome |
studente | CHIAVE PRIMARIA | PRIMARIO |
studente | UNICO | numero_personale |
studente | CHIAVE ESTERA | studente_ibfk_1 |
studente | CONTROLLA | student_chk_1 |
Discussione:
Quando creiamo le nostre tabelle, impostiamo dei vincoli per alcune colonne. Tuttavia, non specifichiamo i nomi per questi vincoli, quindi sono nominati per impostazione predefinita in MySQL. In MySQL, i tipi di vincolo predefiniti sono PRIMARY KEY
, FOREIGN KEY
, UNIQUE
e CHECK
. Come vengono generati i nomi predefiniti per i vincoli?
Il PRIMARY KEY constraint
si chiama semplicemente PRIMARY
, perché in una tabella è sempre presente una chiave primaria. Ci sono due vincoli chiamati PRIMARY
nel risultato sopra, ma le tabelle a cui appartengono sono diverse.
Per FOREIGN KEY
, il nome segue la convenzione:il nome della tabella, un trattino basso ('_
'), 'ibfk
', un altro trattino basso ('_
'), e un numero. Per il nostro esempio, è student_ibfk_1
nella tabella student
.
Il nome predefinito per un CHECK
vincolo è simile a quello della chiave esterna. Inizia con il nome della tabella, un trattino basso ('_
'), 'chk
', un altro trattino basso ('
_
'), e un numero. Per il nostro esempio, è student_chk_1
nella tabella student
.
Il nome predefinito di un UNIQUE
vincolo è il nome della colonna stessa. Per il nostro esempio, è personal_number
nella tabella student
. Quando sono presenti più colonne con UNIQUE
vincolo, utilizza il nome della prima colonna nella definizione del vincolo.