在尝试添加外国密钥违规时,我会遇到此错误:

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

我需要对所有在删除该项目时共享项目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;

太感谢了!

有帮助吗?

解决方案

更改 project_id 具有相同尺寸的列 smallint(6) (或5)。您还需要使它们既有签名或未签名。

...从MySQL网站上说:

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

其他提示

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

应该不是project_id的 smallint(6)?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top