【问题标题】:MySQL : Foreign KeyMySQL:外键
【发布时间】:2015-09-08 09:07:27
【问题描述】:

我的 MySQL 数据库中有两个表,其中包含奖项和成员。我想将 member_name 设置为奖励表中的外键,而不是 member_id。

我在 members 表中将 member_name 设置为 UNIQUE 并尝试将其设置为外键,但出现错误:

无法添加或更新子行:外键约束失败

谁能告诉我为什么会出现这个错误?

【问题讨论】:

  • 您使用的是什么查询?你的CREATE TABLE 声明是什么?
  • 您是否检查过您的奖励表中的任何 member_name 是否在您的会员表中不存在,或者写的不同?
  • 这是我的查询 @cxw - ALTER TABLE awards ADD FOREIGN KEY (member_name) REFERENCES isec.members(member_name) ON DELETE RESTRICT ON UPDATE RESTRICT;跨度>
  • @Lukas 我已经检查过了,它存在于两个表中。
  • 只需在 members 表的 member_name 列上创建索引并执行您的外键更改查询。

标签: mysql database phpmyadmin


【解决方案1】:

您的错误表明您正在尝试插入子行,而其对应的行在其主表中不存在。所以先在主表中插入,然后在子表中。

如果不是这种情况,那么您还可以检查您是否正在尝试在成员表中创建外键 member_name 作为字符串,而在奖励表中将 member_id 作为 int,而要建立外键关系,两个字段的数据类型都应该是一样。

如果不是这种情况,则共享您的表结构和更改查询以生成外键。

注意:int 数据类型的外键性能总是比字符串好。因此,如果没有具体原因,您应该保留 member_id 而不是 member_name。

【讨论】:

  • 嗨,这是我的表结构:awards:awardsID int(11),member_name varchar(40),award_title varchar(100),level varchar(40),year_received整数(11)。 members:member_id int(11)、member_name varchar(40)、position varchar(30)、faculty varchar(10)、email varchar(100)、research_interests varchar(255)。 更改查询:ALTER TABLE awards ADD FOREIGN KEY (member_name) REFERENCES isec.members(member_name) ON DELETE RESTRICT ON UPDATE RESTRICT;
  • @Azie:如果它对您有帮助,那么您可以选择它作为答案.. :)
  • 好建议。外键在使用 int 数据类型时比字符串具有更好的性能。
【解决方案2】:

如果您提供更多详细信息,将更容易回答这个问题 两种表结构。

无论如何,该错误很可能表明现有数据集中存在违反外键约束的记录,即awards 表中的member_name 不存在于@ 987654323@表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-03
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多