2010-02-10 11 views

risposta

98

In MySQL, non è necessario assegnare un nome simbolico ai vincoli di chiave esterna. Se non viene fornito un nome, InnoDB crea automaticamente un nome univoco.

In ogni caso, questa è la convenzione che uso:

fk_[referencing table name]_[referenced table name]_[referencing field name] 

Esempio:

CREATE TABLE users(
    user_id int, 
    name  varchar(100) 
); 

CREATE TABLE messages(
    message_id int, 
    user_id int 
); 

ALTER TABLE messages ADD CONSTRAINT fk_messages_users_user_id 
    FOREIGN KEY (user_id) REFERENCES users(user_id); 

cerco di restare con gli stessi nomi di campo in riferimenti e tabelle di riferimento, come in user_id nell'esempio sopra. Quando ciò non è pratico, aggiungo anche il nome del campo referenziato al nome della chiave esterna.

Questa convenzione di denominazione mi consente di "indovinare" il nome simbolico semplicemente osservando le definizioni della tabella e inoltre garantisce anche nomi univoci.

+13

Il motivo per la creazione di un nome simbolico è il riferimento quando si desidera/è necessario eliminare il vincolo. Oracle e SQL Server consentono di disabilitare vincoli specifici. Se non hai fk nel nome, devi confermare che il vincolo è un vincolo di chiave esterna ... –

+9

Quello che mi piace fare è usare una doppia sottolineatura tra il nome della tabella di riferimento e il nome della tabella di riferimento. Questo ti dà i doppi vantaggi delle inserzioni alfabetiche mantenendo tutti gli FK di una tabella insieme e allo stesso tempo ti aiuta a evitare conflitti di nome/confusione quando ci sono più nomi di tabelle di parole. Ometto anche la parte del campo del nome quando è banale (cioè un campo int singolo fa riferimento all'identità PK di un'altra tabella). –

+2

Cosa succede se ci sono più di 1 chiave esterna? Esempio: 'member_id' ~> collegamento al membro della tabella,' edited_id' ~> chiave esterna per utente modificato, collegamento anche al membro della tabella. Come dovrei nominarli? – TomSawyer

22

la mia scelta è diversa. a mio parere, un tavolo dovrebbe avere un campo "id", non un "user_id" uno, perché la tabella è appena chiamato "utente", quindi:

CREATE TABLE users(
    id int, 
    name  varchar(100) 
); 

CREATE TABLE messages(
    id int, 
    user_id int 
); 

"user_id" in "messaggi" da tavolo è una fk field quindi deve chiarire quale id è ("user_id").

una convenzione di denominazione completamente autoesplicativo, a mio parere, potrebbe essere:

fk_[referencing table name]_[referencing field name]_[referenced table name]_[referenced field name] 

i.e.: fk_messages_user_id_users_id 

nota:

  • si può, in alcuni casi, omettere il secondo elemento ([campo riferimento nome])
  • questo file fk potrebbe essere univoco, perché se esiste una tabella "messages_user", il nome del campo di riferimento dovrebbe essere "user_id" (e non solo "id") e il nome fk dovrebbe essere:

    fk_messages_user_user_id_users_id

in altre parole, una convenzione di denominazione chiave esterna ti fanno sicuro di nomi univoci se si utilizza anche un "riferimento/campo di riferimento" convenzione di denominazione (e si può scegliere il proprio, ovviamente) .

7

Se non ci si trova a fare riferimento a fk che spesso dopo la creazione, un'opzione è di mantenerla semplice e lasciare che MySQL faccia il naming per voi (come Daniel Vassallo mentions in the beginning of his answer).

Anche se non sarà in grado di univocamente "indovinare" i nomi di vincolo con questo metodo - si può facilmente trovare il nome del vincolo di chiave esterna eseguendo una query:

use information_schema; 
select TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME from KEY_COLUMN_USAGE where REFERENCED_TABLE_SCHEMA = 'your_db_schema_name' ORDER BY TABLE_NAME; 

Per esempio si potrebbe ricevere il seguito dalla query:

+------------+-------------+-----------------+-----------------------+------------------------+ 
| TABLE_NAME | COLUMN_NAME | CONSTRAINT_NAME | REFERENCED_TABLE_NAME | REFERENCED_COLUMN_NAME | 
+------------+-------------+-----------------+-----------------------+------------------------+ 
| note  | taskid  | note_ibfk_2  | task     | id      | 
| note  | userid  | note_ibfk_1  | user     | id      | 
| task  | userid  | task_ibfk_1  | user     | id      | 
+------------+-------------+-----------------+-----------------------+------------------------+ 

Se questo ulteriore passaggio non è troppo per voi, allora si dovrebbe essere in grado di trovare facilmente il fk che stai cercando.

Problemi correlati