创建外键时出错

时间:2010-01-04 21:44:33

标签: mysql foreign-keys mysql-error-1005

尝试添加外键约束时出现此错误:

#1005 - Can't create table './testtable/#sql-595_146.frm' (errno: 150)

我需要为删除该项目时共享项目ID的所有图像执行ON DELETE CASCADE。我的简化表结构如下:

CREATE TABLE IF NOT EXISTS `images` (
`image_id` mediumint(8) unsigned NOT NULL auto_increment,
`project_id` smallint(6) NOT NULL,
PRIMARY KEY  (`image_id`),
KEY `project_id_ix` (`project_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=28 ;

CREATE TABLE IF NOT EXISTS `projects` (
`project_id` smallint(5) unsigned NOT NULL auto_increment,
PRIMARY KEY  (`project_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;

现在,当我运行下面的查询来添加约束时,查询失败并显示上面发布的错误。有人可以帮忙吗?

ALTER TABLE `images` ADD CONSTRAINT `project_id_fk` FOREIGN KEY (`project_id`) REFERENCES `projects` (`project_id`) ON DELETE CASCADE;

万分感谢!

3 个答案:

答案 0 :(得分:1)

project_id列更改为相同大小smallint(6)(或5)。您还需要签名或签名。

...从mysql网站上说:

  

外键和引用键中的相应列必须在InnoDB内部具有类似的内部数据类型,以便可以在不进行类型转换的情况下对它们进行比较。整数类型的大小和符号必须相同。字符串类型的长度不必相同。对于非二进制(字符)字符串列,字符集和排序规则必须相同。

答案 1 :(得分:1)

我认为数据类型需要匹配。 project_id在一个表中是smallint(6)而在另一个表中是smallint(5)。

答案 2 :(得分:1)

project_id不应该都是smallint(6)吗?