2012-06-17 26 views
8

Jak zmienić istniejącą tabelę w MySQL, ustawiając klucz obcy na inną tabelę, używając wiersza poleceń?Jak zmienić klucz obcy MySQL za pomocą wiersza polecenia

+0

Próbowałem użyć google i nie znalazłem niczego, co obejmowałoby tę dokładną sprawę. Wiem, aby to zrobić w Administratorze MySQL lub utworzyć tabelę z kluczem obcym, ale nie znam tego we wspomnianym pytaniu. –

+0

Należy pamiętać, że dokumentację produktu można znaleźć w Google przy użyciu 'mysql 5.7 alter table'. –

Odpowiedz

16

Musisz opuścić istniejący foreign key i utworzyć inny. Na przykład takich jak to:

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

Twój kod działa, ale mam powiązane pytanie. Kiedy próbowałem połączyć te dwa zapytania w jedno zapytanie, 'ALTER TABLE my_table DROP ..., ADD ...' Wystąpił błąd, _errno: 121 "Zduplikowany klucz przy zapisie lub aktualizacji" _. Czy brakuje mi czegoś, czy też nie da się połączyć tych zapytań? – iloo

2

Execute help alter table na mysql wierszu polecenia, a wyjście jest bardzo wymowne.
Poszukaj add constraint z klauzulą ​​i zastosuj ją do swojego stołu.

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

udało mi się osiągnąć to samo przez:

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

Jeśli wiele kluczy obcych przykuty razem i pojawi się błąd, który kończy z errorno 15x to najprawdopodobniej oznacza, że ​​istnieją inne tabele które są zależne od klucza obcego, który próbujesz upuścić.

Aby upuścić klucz obcy, gdy pojawi się ten błąd, musisz wykonać SET FOREIGN_KEY_CHECKS = 0;, a następnie musisz najpierw usunąć klucze obce z tabel, które nie mają żadnych innych tabel zależnych od nich. Następnie można z powodzeniem upuścić klucze obce na następnej tabeli w łańcuchu i tak dalej.

Po zakończeniu uruchom ponownie SET FOREIGN_KEY_CHECKS = 1;.