2010-01-04 49 views
0

我越来越想添加一个外键contraint当这个错误:错误当创建一个外键

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

我需要做一个ON DELETE CASCADE的共享项目ID的所有图像时项目被删除。我的简化表结构如下:

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; 

非常感谢!

+0

如果MySQL从CREATE TABLE语句报告错误编号1005,并且错误消息引用了错误150,表创建失败,因为外键约束未正确形成:http://dev.mysql.com/doc/ refman/5.1/en/innodb-foreign-key-constraints.html – 2010-01-04 21:47:07

+0

^是的男人,我知道错误说什么。我无法弄清楚的是我的错误在哪里。这就是为什么我要求帮助 – user239237 2010-01-04 21:52:41

回答

1

project_id列更改为具有相同大小smallint(6)(或5)。您还需要使它们都有符号或无符号。

...从MySQL的网站,它说:外键和引用的密钥必须在InnoDB类似的内部数据类型

对应的字段,以便他们可以不用类型转换比较。整数类型的大小和符号必须相同。字符串类型的长度不需要相同。对于非二进制(字符)字符串列,字符集和归类必须相同。

+0

它也签署在一个表中,并在另一个表中签名。 – Powerlord 2010-01-04 21:51:37

+0

在我收到你的评论之前发现。谢谢 – munch 2010-01-04 21:52:34

+0

修复它!我从来没有抓到过!谢谢您的帮助! – user239237 2010-01-04 21:59:08

1

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

+0

蒙克击败了我。前两天刚刚有这个错误,并发现他发布相同的blurb = D – decompiled 2010-01-04 21:56:58

+0

这就是它!谢谢您的帮助! – user239237 2010-01-04 21:58:29

1

不应该project_id都是smallint(6)

+0

Bah。没有收到“新消息”弹出窗口。旧消息。 – Satanicpuppy 2010-01-04 21:58:50