【问题标题】:Cannot add a foreign key to exists table无法将外键添加到现有表
【发布时间】:2014-01-15 23:31:41
【问题描述】:

我无法向我的存在表添加外键。我想从表games 中添加一个外键publisher_idpublishers (publisher_id) 的引用。

但是当运行下面的 sql 时,它会说:

源列和目标列必须具有相同的数据类型,目标列上必须有索引,并且引用的数据必须存在。 无法添加或更新子行:外键约束失败 (vngarena.com.#sql-818_1b1, CONSTRAINT #sql-818_1b1_ibfk_2 FOREIGN KEY (publisher_id) REFERENCES publishers (publisher_id) ON DELETE CASCADE ON UPDATE CASCADE

sql是:

更改表games
添加外键 (publisher_id) 引用 publishers (publisher_id) ON DELETE CASCADE ON UPDATE CASCADE;

这是我的数据库的图表:

更多信息:
- 表 games 有两条记录
- 表 games 有其他外键引用表 gamecats (gamecat_id)
- 表 gamecats 有两条记录
- 表publishers 没有记录

【问题讨论】:

  • games中的那两条记录...在publisher_id列中有值吗?

标签: mysql sql foreign-keys


【解决方案1】:

如果存在违反关系的任何现有数据,则需要在添加密钥之前对其进行清理。

[已编辑]

编辑后:桌面游戏中的 publisher_id 正在 publishers 表中寻找匹配项。添加一个 id 与 games 表中的内容相匹配的发行商。

【讨论】:

  • 是的,因为games 表中publisher_id 列的默认值为0,而publishers 表没有任何与子记录匹配的记录。因此,当将外键publisher_id 添加到games 时,它失败了。我必须在表publishers 中插入一条记录,然后将其主表更新为0,然后将外键添加到表games,它就成功了!非常感谢。
【解决方案2】:

添加外键前需要删除游戏表记录。

如果添加外键,它应该与现有数据匹配。在您的情况下,publishers 表没有记录。所以如果你在游戏表中添加带有记录的数据,它将失败foreign key

                             or

您应该在 publishers 表中添加两条记录,并且 games 表中存在相同的键。

更多详情,请参考以下链接 Foreign Key

【讨论】:

  • 是的,我不想删除我的数据,所以我在上面的评论中发布了一个解决方案。
  • @NguyễnTrọngBằng。雅两种方式都正确。如果你不需要删除,你应该在publisher id表中添加匹配的publisher_id记录..
猜你喜欢
  • 2012-04-19
  • 2014-02-20
  • 1970-01-01
  • 2013-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多