MySQL-向现有表中添加外键

MySQL-向现有表中添加外键,mysql,sql,database,foreign-keys,cascading-deletes,Mysql,Sql,Database,Foreign Keys,Cascading Deletes,我正在尝试向下表添加外键,因此当从父表“accounts”中删除一行时,“threads”中的对应行将被删除。我已经成功地使用了“messages”表,它是“threads”的子表 ALTER TABLE `threads` ADD FOREIGN KEY ( `owner_id` ) REFERENCES `social_network`.`accounts` (`id`) ON DELETE CASCADE 现在,我得到了一个错误: #1050 - Table '.\social

我正在尝试向下表添加外键,因此当从父表“accounts”中删除一行时,“threads”中的对应行将被删除。我已经成功地使用了“messages”表,它是“threads”的子表

ALTER TABLE  `threads` ADD FOREIGN KEY (  `owner_id` ) 
REFERENCES `social_network`.`accounts` (`id`) 
ON DELETE CASCADE 
现在,我得到了一个错误:

#1050 - Table '.\social_network\threads' already exists
这对我来说毫无意义,因为如果表不存在,我就不会试图“改变表”。为了增加混乱,这个SQL是由phpMyAdmin使用其内置工具自动生成的


有人能给我解释一下引发此错误的原因以及如何修复它吗?

我认为您可以做以下几点:

  • 检查表是否存在
    删除表(如果存在)
  • 维修表
  • 尝试插入值,它应该可以工作

    • 我认为您可以做以下几点:

      • 检查表是否存在
        删除表(如果存在)
      • 维修表
      • 尝试插入值,它应该可以工作
      你看到这个链接了吗

      他说要和InnoDB一起拍桌子。我想你可以放下表,创建一个新的,现在使用外键。我在这里经常这样做!你也可以看到这个

      您已经检查了所有表是否都有相同的引擎?

      您看到这个链接了吗

      他说要和InnoDB一起拍桌子。我想你可以放下表,创建一个新的,现在使用外键。我在这里经常这样做!你也可以看到这个


      您已经检查了所有表是否都有相同的引擎?

      此答案是Bruno Casali和Maverick发布的答案的后续内容。事实上,我可以通过修理我的桌子来解决这个问题。InnoDB引擎不支持修复操作,所以我只是重新创建并重新填充了表:

      CREATE TABLE threads_tmp LIKE threads;
      INSERT INTO threads_tmp SELECT * FROM threads;
      TRUNCATE TABLE threads;
      INSERT INTO threads SELECT * FROM threads_tmp;
      DROP TABLE threads_tmp;
      

      希望这能帮助有同样问题的人

      这个答案是布鲁诺·卡萨利和马弗里克发布的答案的后续。事实上,我可以通过修理我的桌子来解决这个问题。InnoDB引擎不支持修复操作,所以我只是重新创建并重新填充了表:

      CREATE TABLE threads_tmp LIKE threads;
      INSERT INTO threads_tmp SELECT * FROM threads;
      TRUNCATE TABLE threads;
      INSERT INTO threads SELECT * FROM threads_tmp;
      DROP TABLE threads_tmp;
      

      希望这能帮助有同样问题的人

      这个错误消息通常意味着,由于先前存在的密钥冲突,无法添加外键。我没有向该表添加任何外键。但是,有一个子表有一个外键引用该表,这可能是导致问题的原因吗?是否有办法(使用phpMyAdmin或其他方式)查看指定表的外键列表?注意:在创建外键时,如果存在键冲突,则显然无法创建键-这有时会导致出现奇怪的“表已存在”消息。检查是否有违反新键的行。只需尝试“从线程左键选择*加入线程上的帐户。所有者\u id=accounts.id,其中accounts.id为NULL”-如果结果不是空的,则说明存在此问题。您使用的是哪种数据库引擎?你检查过这个问题的答案了吗?这个错误消息通常意味着,由于先前存在的密钥冲突,无法添加外键。我没有向该表添加任何外键。但是,有一个子表有一个外键引用该表,这可能是导致问题的原因吗?是否有办法(使用phpMyAdmin或其他方式)查看指定表的外键列表?注意:在创建外键时,如果存在键冲突,则显然无法创建键-这有时会导致出现奇怪的“表已存在”消息。检查是否有违反新键的行。只需尝试“从线程左键选择*加入线程上的帐户。所有者\u id=accounts.id,其中accounts.id为NULL”-如果结果不是空的,则说明存在此问题。您使用的是哪种数据库引擎?你检查过这个问题的答案了吗?这个表肯定存在,我可以对它执行其他操作。我确实试图使用桌子上的维修声明。查询已成功执行,但我收到消息:表的存储引擎不支持修复。我使用的是InnoDB引擎,据我所知,如果我想实现外键,这是必要的。尽管修复操作不受支持,但你知道问题所在,并且是第一个提供良好解决方案的人,所以我给了你奖金。谢谢这个表肯定存在,我可以对它执行其他操作。我确实试图使用桌子上的维修声明。查询已成功执行,但我收到消息:表的存储引擎不支持修复。我使用的是InnoDB引擎,据我所知,如果我想实现外键,这是必要的。尽管修复操作不受支持,但你知道问题所在,并且是第一个提供良好解决方案的人,所以我给了你奖金。谢谢