2012-06-17 23 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;