mysql - 向表添加外键约束

问题描述 投票:0回答:1

我有两个表,名称为

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)

我的问题是,如何在 user_friends 表上应用约束,以便在 user_friends 表中所有这些记录删除或设置为 null 谁的用户被删除。

mysql foreign-keys
1个回答
0
投票

您遇到的错误表明 user_friends 表中存在带有 userId 的记录,而 user 表中不存在该记录。为了能够实现您想要做的事情,首先确保有效的 userId 附加到此类用户,或为此类用户分配 null 值。

这是你可以做的。

  1. 在 user_friends 中查找无效的 user_id 引用

// mysql 

SELECT user_friends.user_id
FROM user_friends
LEFT JOIN user ON user_friends.user_id = user.id
WHERE user.id IS NULL;

  1. 将无效的 user_id 引用更新为 NULL 或有效的用户 ID 例如,将它们设置为 NULL

// mysql

UPDATE user_friends
LEFT JOIN user ON user_friends.user_id = user.id
SET user_friends.user_id = NULL
WHERE user.id IS NULL

  1. 使用为 userId 设置的值清理 user_friends 表后,您应该能够添加外键约束而不会出现任何错误。
© www.soinside.com 2019 - 2024. All rights reserved.