2012-06-17 22 views
8

如何使用命令行更改MySQL中的現有表,將外鍵設置爲另一個表?如何使用命令行更改MySQL表的外鍵

+0

我試圖使用谷歌,它沒有發現任何涵蓋此確切情況。我知道在MySQL Administrator中執行該操作,或者使用外鍵創建表,但在提到的問題中我不知道這一點。 –

+0

請注意,您可以使用'mysql 5.7 alter table'在Google中找到產品文檔。 –

回答

16

您必須刪除現有的foreign key並創建另一個。例如是這樣的:

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

您的代碼有效,但我有一個相關的問題。當我試圖將這兩個查詢合併爲一個查詢時,'ALTER TABLE my_table DROP ...,ADD ...'出現錯誤,_errno:121「寫入或更新時出現重複鍵」_。我錯過了什麼,或者確實不可能合併這些查詢? – iloo

2

mysql命令提示符執行help alter table並且輸出是非常自我解釋。
查找add constraintforeign key子句並將其應用於您的表。

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

我能夠實現同樣的事情:

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

如果你有多個外鍵鏈接在一起,你會得到與errorno 15x結束一個錯誤就極有可能意味着有其他表這取決於您要刪除的外鍵。

要在出現該錯誤時刪除外鍵,您需要執行SET FOREIGN_KEY_CHECKS = 0;,然後必須首先將外鍵刪除到沒有任何其他表依賴它們的表上。然後,您可以成功地將外鍵放在鏈中的下一張表上,等等。

完成後,請確保您再次運行SET FOREIGN_KEY_CHECKS = 1;