2012-06-17 14 views
8

Come modificare una tabella esistente in MySQL, impostando la chiave esterna su un'altra tabella, utilizzando la riga di comando?Come modificare la chiave esterna di una tabella MySQL utilizzando la riga di comando

+0

Ho provato a utilizzare google e non ho trovato nulla che riguardasse questo caso esatto. So di farlo in MySQL Administrator, o di creare una tabella con chiave esterna, ma non lo so nella domanda menzionata. –

+0

Si prega di notare che è possibile trovare la documentazione del prodotto su Google con 'mysql 5.7 alter table'. –

risposta

16

Devi eliminare lo foreign key esistente e crearne un altro. Ad esempio come questo:

ALTER TABLE my_table DROP FOREIGN KEY my_key; 
ALTER TABLE my_table ADD CONSTRAINT my_key FOREIGN KEY ('some_id') 
REFERENCES some_new_table ('some_other_id') ON UPDATE CASCADE ON DELETE CASCADE; 
+0

Il tuo codice funziona, ma ho una domanda correlata. Quando ho provato a combinare queste due query in una singola query, 'ALTER TABLE my_table DROP ..., ADD ...' Ho ricevuto un errore, _errno: 121 "Duplicate key on write or update" _. Mi manca qualcosa, o è davvero impossibile combinare queste domande? – iloo

2

Eseguire help alter table a mysql riga di comando e l'uscita è molto evidente.
Cerca add constraint con clausola foreign key e applicalo sul tuo tavolo.

mysql> help alter table 
Name: 'ALTER TABLE' 
Description: 
Syntax: 
ALTER [IGNORE] TABLE tbl_name 
    alter_specification [, alter_specification] ... 

alter_specification: 
    ADD [COLUMN] column_definition [FIRST | AFTER col_name ] 
    | ADD [COLUMN] (column_definition,...) 
    | ADD {INDEX|KEY} [index_name] [index_type] (index_col_name,...) 
    | ADD [CONSTRAINT [symbol]] 
     PRIMARY KEY [index_type] (index_col_name,...) 
    | ADD [CONSTRAINT [symbol]] 
     UNIQUE [INDEX|KEY] [index_name] [index_type] (index_col_name,...) 
    | ADD [FULLTEXT|SPATIAL] [INDEX|KEY] [index_name] (index_col_name,...) 
    | ADD [CONSTRAINT [symbol]] 
     FOREIGN KEY [index_name] (index_col_name,...) 
     [reference_definition] 
    | ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT} 
    | CHANGE [COLUMN] old_col_name column_definition 
     [FIRST|AFTER col_name] 
    | MODIFY [COLUMN] column_definition [FIRST | AFTER col_name] 
    | DROP [COLUMN] col_name 
    | DROP PRIMARY KEY 
    | DROP {INDEX|KEY} index_name 
    | DROP FOREIGN KEY fk_symbol 
    | DISABLE KEYS 
    | ENABLE KEYS 
    | RENAME [TO] new_tbl_name 
    | ORDER BY col_name 
    | CONVERT TO CHARACTER SET charset_name [COLLATE collation_name] 
    | [DEFAULT] CHARACTER SET charset_name [COLLATE collation_name] 
    | DISCARD TABLESPACE 
    | IMPORT TABLESPACE 
    | table_option ... 
2

sono stato in grado di ottenere la stessa cosa:

ALTER TABLE the_table_name 
    ADD CONSTRAINT the_name_of_column_you_want_to_use_as_foreign_key 
     REFERENCES other_table_primary_id (Column_name) 
2

Se si dispone di più chiavi esterne incatenati insieme e si ottiene un errore che si conclude con errorno 15x molto probabilmente significa che ci sono altri tavoli che dipendono dalla chiave esterna che stai cercando di eliminare.

Per eliminare la chiave esterna quando si riceve quell'errore, è necessario eseguire SET FOREIGN_KEY_CHECKS = 0; e quindi è necessario innanzitutto eliminare le chiavi esterne sulle tabelle che non hanno altre tabelle dipendenti da esse. È quindi possibile rilasciare correttamente le chiavi esterne sul tavolo successivo nella catena e così via.

Al termine, assicurati di eseguire nuovamente SET FOREIGN_KEY_CHECKS = 1;.

Problemi correlati