尝试添加外键约束时出现此错误:
#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;
万分感谢!
答案 0 :(得分:1)
将project_id
列更改为相同大小smallint(6)
(或5)。您还需要签名或签名。
...从mysql网站上说:
外键和引用键中的相应列必须在InnoDB内部具有类似的内部数据类型,以便可以在不进行类型转换的情况下对它们进行比较。整数类型的大小和符号必须相同。字符串类型的长度不必相同。对于非二进制(字符)字符串列,字符集和排序规则必须相同。
答案 1 :(得分:1)
我认为数据类型需要匹配。 project_id在一个表中是smallint(6)而在另一个表中是smallint(5)。
答案 2 :(得分:1)
project_id不应该都是smallint(6)
吗?