我有两个表名users
,user_friends
。user有超过1000万条记录,user_friends有超过6亿条记录。问题是它没有约束。即,当用户被删除时,他们的朋友列表在数据库中。一切正常。但是现在我们实现了一个新的功能,它有user_social_friends。我已经把所有的约束都用在里面了。
现在我想对user_friends
表应用约束,如下所示
SQL query:
ALTER TABLE `user_friends` ADD CONSTRAINT `user_id_key_contstraint` FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
MySQL said: Documentation
#1452 - Cannot add or update a child row: a foreign key constraint fails (`callerap_finder`.`#sql-d9fad_24e`, CONSTRAINT `user_id_key_contstraint` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)
我的问题是,我如何应用一个约束的用户_朋友表,使在表用户_朋友所有这些记录删除或设置为空谁的用户被删除。
2条答案
按热度按时间lbsnaicq1#
如果我理解正确的话,您在
user_friends
中有违反您试图添加的外键约束的记录。您可以按照以下步骤来避免此错误1.首先删除
user_friends
表中的记录或将其设置为空。2.现在运行查询以添加约束
但正如你所说,你有非常大量的数据,那么我认为你必须建立另一个表,从
user
表中获取有效的用户ID,并在此基础上,你可以删除或更新user_friends
表中的记录。例如
StepOne
第二步
如果
user_friends
表中没有user_id
,请创建索引。第三步
现在你所要做的就是删除或空的记录,然后添加你的约束删除,你可以使用这样的东西
第四步
现在,只需添加上述第2点中的查询的约束。
提示:-
例如,您可以批量获取数据并相应地更新它们
这个查询将返回您必须Map的行数,并从这样的行中获取id
const userIDs = rows.map((row) => row.id).join(',');
,然后像这样更改StepThree
wpx232ag2#
您所面临的错误表明user_friends表中存在具有user ID的现有记录,而user表中不存在该记录。为了能够实现您想要做的事情,首先确保有效的userId附加到这些用户,或者为这些用户分配空值。
这是你能做的。
1.在user_friends中查找无效的user_id引用
1.将无效的user_id引用更新为NULL或有效的用户ID例如,将它们设置为NULL
1.在使用userId设置的值清理user_friends表之后,您应该能够添加外键约束,而不会出现任何错误。