-
18-09-2019 - |
题
在尝试添加外国密钥违规时,我会遇到此错误:
#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)
?
不隶属于 StackOverflow