0

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

#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;

太感谢了!

4

3 回答 3

1

将列更改project_id为相同大小smallint(6)(或 5 个)。您还需要使它们都签名或未签名。

...从mysql网站上它说:

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

于 2010-01-04T21:50:02.007 回答
1

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

于 2010-01-04T21:51:11.897 回答
1

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

于 2010-01-04T21:57:37.977 回答