【问题标题】:Error When creating a foreign key创建外键时出错
【发布时间】:2010-01-04 21:44:33
【问题描述】:

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

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

谢谢一百万!

【问题讨论】:

  • 如果 MySQL 从 CREATE TABLE 语句中报告错误号 1005,并且错误消息指的是错误 150,则表创建失败,因为没有正确形成外键约束:dev.mysql.com/doc/refman/5.1/en/…
  • ^ 是的,我知道错误的含义。我无法弄清楚我的错误在哪里。这就是我寻求帮助的原因

标签: mysql foreign-keys mysql-error-1005


【解决方案1】:

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

...从 mysql 网站上它说:

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

【讨论】:

  • 它也在一张表中签名,在另一张表中未签名。
  • 在我收到您的评论之前发现了这一点。不过谢谢
  • 解决了!我永远不会抓住那个!感谢您的帮助!
【解决方案2】:

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

【讨论】:

  • munch 打败了我。两天前刚遇到这个错误,发现他发布的同样的简介=D
  • 原来如此!感谢您的帮助!
【解决方案3】:

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

【讨论】:

  • 呸。没有收到“新消息”弹出窗口。旧闻。
猜你喜欢
  • 2017-07-04
  • 1970-01-01
  • 2013-06-09
  • 1970-01-01
  • 2021-10-09
  • 1970-01-01
  • 2019-01-31
  • 1970-01-01
  • 2015-04-28
相关资源
最近更新 更多