ForeignKeyConstraintError [SequelizeForeignKeyConstraintError]:在表“头像”上插入或更新违反了外键约束

Posted

技术标签:

【中文标题】ForeignKeyConstraintError [SequelizeForeignKeyConstraintError]:在表“头像”上插入或更新违反了外键约束【英文标题】:ForeignKeyConstraintError [SequelizeForeignKeyConstraintError]: insert or update on table "avatars" violates foreign key constraint 【发布时间】:2020-11-22 01:24:23 【问题描述】:

我有两个表,用户名被称为不同的东西,但它们是通过外键连接的: 表用户有一个列用户名 表 avatars 有一列 ownerUsername

我陷入了这个外键问题并更新了一条记录。我最近重新制作了外键以具有 UPDATE CASCADE,但尝试更新时仍然出现此错误:

ForeignKeyConstraintError [SequelizeForeignKeyConstraintError]:在表“avatars”上插入或更新违反了外键约束“User_OwnerUsername_fk”

它还在下面进一步说明:

detail: Key (ownerUsername)=(theSunBurn) 不存在于表“users”中

我不确定这里有什么问题。是因为用户表中的“用户名”字段在头像表中被称为“所有者用户名”吗?还是因为我在头像表中将 ownerUsername 更新为“theSunBurn”,但在 users 表中它仍然是旧用户名?另外,当使用外键更新字段时,我应该以某种方式同时更新两个表吗?

【问题讨论】:

【参考方案1】:

据我了解,使用的外键不是 Id,而是可变键,即“用户名”。 您问的问题与“头像”表中列的名称无关。问题是当我们使用不作为主键存在的值(将 ownerUsername 更新为“theSunBurn”)更新外键时,它会显示您收到的错误。

您可以使用 ID 而不是 UserName 作为外键 或者 每当您想在头像中更新时,首先在用户中创建一个条目(如果尚未存在)

【讨论】:

我想我明白你在说什么。我的问题是,我想引用“用户”表中的“用户名”,而不是那里的 id。我希望能够在需要时从用户那里访问用户的用户名,但我也希望用户名作为“头像”中的一个字段,这样在另一个页面上,我只需要对头像进行 SQL 查询,我就会收到准确的用户名也是如此。我应该为此使用联接吗? 是的,你是对的。加入是要走的路。您的用户名驻留在用户表中,没关系。您可以在头像表中使用 userId 作为外键。所以每当你想编辑用户名时,你可以直接在用户表中编辑,它会在任何被引用的地方反映出来(在这种情况下是头像表) 太好了,这很有道理!感谢您的回答。 几个相关问题: 1. 外键是否通常用于引用其他表中的主键,是否不常见引用其他列? 2. 我现在需要在“头像”中为 userId 创建一个新字段。我已经有 200 多个用户,有没有办法自动将他们的 id 分配给我在“头像”中的新 userId 字段? 回答您的问题 1. 是 2. 您必须将数据迁移到“头像”中现有条目的头像中。如果现有的用户名列有正确的条目,那么您可以使用子查询在头像表上编写更新查询,用户名 = 头像的用户名作为更新条件【参考方案2】:

在我的情况下,问题是我正在使用表中的主键,该表中的记录不存在于该表中。所以我创建了新条目,然后使用它并修复了。

【讨论】:

以上是关于ForeignKeyConstraintError [SequelizeForeignKeyConstraintError]:在表“头像”上插入或更新违反了外键约束的主要内容,如果未能解决你的问题,请参考以下文章

修复了Innodb完整性约束违规:1452 [重复]

MySQL 中的外键约束错误 1452 - Magento 导入