2010-08-11 44 views
2

什么是错的这个alter table命令:MYSQL改变表 - 添加索引+ FOREIGN KEY给错误1005

ALTER TABLE `lp` 
ADD COLUMN `RuleId` INT(10) NOT NULL DEFAULT -111 AFTER `Weight` , , 
ADD CONSTRAINT `fk_1` FOREIGN KEY (`RuleId`) REFERENCES `Rules` (`RuleId`) ON DELETE NO ACTION ON UPDATE NO ACTION, 
ADD INDEX `fk_1` (`RuleId` ASC) ; 

如果我把线

工作,

我得到的错误是:

Error Code : 1005 
Can't create table '..' (errno: 121) 

如何在同一字段上添加FOREIGN KEY和INDEX?

更新:

我尝试分离到2个查询,先添加索引和添加外键后,增加了指数,但第二个查询不工作!

当我改变外键的名称(如:“fk_2”),并尝试运行它,我得到一个错误:错误代码:1452不能添加或更新子行,外键约束失败

回答

4

首先创建索引,然后再创建外键约束。 MySQL需要一个索引来创建外键,这就是为什么你必须首先创建索引。也使用单独的语句。

+0

我试着分开,但同样的问题 – 2010-08-11 06:36:25

+0

啊,我明白了,你试着给索引和外键限制一个名字。使用独特的名称,它应该工作。 – 2010-08-11 06:53:42

+0

当我更改名称并尝试运行它时出现错误:错误代码:1452无法添加或更新子行:外键约束失败 – 2010-08-11 06:59:17

1

我的确有同样的问题。

我发现的是,如果在数据库中已经存在具有完全相同名称的另一个外键,则无法添加外键。即使其他外键在不同的表上。

ERROR 1005(HY000):无法创建表 './MyDB/#sql-e4a_c715.frm'(错误:121) 正如上面提到的,你会如果你想获得此消息添加一个已经在其他地方使用过的名称的约束。

(来自here两者)​​

所以只是将其重命名为随机检查,如果我是正确的..

0

我得到这个错误模式的DDL从N个Django的合并后的应用程序使用“ manage.py sqlall“命令。

我发现MySQL的DDL需要按照类别的顺序对语句进行分组。具体来说,所有ALTER TABLE ... ADD ... FOREIGN KEY ... 必须最后发生,否则MySQL将引发该错误。

  1. CREATE TABLE ...
  2. CREATE INDEX ...
  3. ALTER TABLE表名ADD约束名FOREIGN KEY ...