【问题标题】:Failed to add the foreign key constraint添加外键约束失败
【发布时间】:2019-12-06 16:49:30
【问题描述】:

我尝试在表上添加外键,但每次尝试时总是出现此错误

ERROR 1822 (HY000): 添加外键约束失败。引用表“all_votes”中的约束“total_ibfk_1”缺少索引

正在创建的表就是这个(members是另一个与错误无关的表,所以不重视它)

CREATE TABLE IF NOT EXISTS all_votes ( 
id_vote INT AUTO_INCREMENT PRIMARY KEY,
id_member INT,
name_member VARCHAR(20),
vote VARCHAR(20) NOT NULL,
type_of_vote VARCHAR(10) NOT NULL,
topic VARCHAR(20) NOT NULL,
FOREIGN KEY (id_member) REFERENCES members(id)
);

这是发生错误的表

CREATE TABLE IF NOT EXISTS total ( 
topic VARCHAR(20) PRIMARY KEY, 
type_of_vote VARCHAR(10) NOT NULL, 
counts INT NOT NULL, 
FOREIGN KEY (topic) REFERENCES all_votes(topic)
);

我已经阅读了大量答案,但似乎没有一个对我有用。 This answer 是最有启发性的,总结得越少。

我猜这个错误与外键对非主键的引用有关。问题是很多人都说有可能,但我没有找到一个代码示例,所以我可能在某个地方搞砸了。

【问题讨论】:

    标签: mysql foreign-keys


    【解决方案1】:

    因为all_votes.topic 列应定义为PRIMARY OR UNIQUE KEY 才能为total.topic 列定义引用的外键。

    【讨论】:

      【解决方案2】:

      'MySQL 需要外键和引用键的索引'https://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html mysql 会在引用表中为您生成键,但您必须在引用表中定义它们。换句话说,您需要在 all_votes 中添加一个关于主题的键。

      这个语法

      CREATE TABLE IF NOT EXISTS all_votes ( 
      id_vote INT AUTO_INCREMENT PRIMARY KEY,
      id_member INT,
      name_member VARCHAR(20),
      vote VARCHAR(20) NOT NULL,
      type_of_vote VARCHAR(10) NOT NULL,
      topic VARCHAR(20) NOT NULL #,
      #FOREIGN KEY (id_member) REFERENCES members(id)
      );
      
      alter table all_votes
          add key abk1(topic); 
      
      CREATE TABLE IF NOT EXISTS total ( 
      topic VARCHAR(20) PRIMARY KEY, 
      type_of_vote VARCHAR(10) NOT NULL, 
      counts INT NOT NULL,
      FOREIGN KEY (topic) REFERENCES all_votes(topic)
          );
      

      注意:我已注释掉#FOREIGN KEY (id_member) REFERENCES members(id)

      【讨论】:

      • 我稍微改变了 all_votes。现在主键是 id_member AND topic,而 id_vote 被完全删除。即使这样,错误仍然存​​在。我理解错了吗?它必须是唯一的主键吗?
      • 否,但主题必须是键的第一个节点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-29
      相关资源
      最近更新 更多