MySQL-向现有表中添加外键
我正在尝试向下表添加外键,因此当从父表“accounts”中删除一行时,“threads”中的对应行将被删除。我已经成功地使用了“messages”表,它是“threads”的子表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
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使用其内置工具自动生成的
有人能给我解释一下引发此错误的原因以及如何修复它吗?我认为您可以做以下几点:
- 检查表是否存在
删除表(如果存在)
维修表
- 尝试插入值,它应该可以工作
- 检查表是否存在
删除表(如果存在)
维修表
- 尝试插入值,它应该可以工作
- 我认为您可以做以下几点:
您已经检查了所有表是否都有相同的引擎?此答案是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引擎,据我所知,如果我想实现外键,这是必要的。尽管修复操作不受支持,但你知道问题所在,并且是第一个提供良好解决方案的人,所以我给了你奖金。谢谢