mysql -为表添加外键约束

u0njafvf  于 2023-10-15  发布在  Mysql
关注(0)|答案(2)|浏览(134)

我有两个表名usersuser_friends。user有超过1000万条记录,user_friends有超过6亿条记录。问题是它没有约束。即,当用户被删除时,他们的朋友列表在数据库中。一切正常。但是现在我们实现了一个新的功能,它有user_social_friends。我已经把所有的约束都用在里面了。
现在我想对user_friends表应用约束,如下所示

  1. SQL query:
  2. ALTER TABLE `user_friends` ADD CONSTRAINT `user_id_key_contstraint` FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
  3. MySQL said: Documentation
  4. #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)

我的问题是,我如何应用一个约束的用户_朋友表,使在表用户_朋友所有这些记录删除或设置为空谁的用户被删除。

lbsnaicq

lbsnaicq1#

如果我理解正确的话,您在user_friends中有违反您试图添加的外键约束的记录。您可以按照以下步骤来避免此错误
1.首先删除user_friends表中的记录或将其设置为空。

  1. DELETE FROM user_friends WHERE user_id NOT IN (SELECT id FROM user);

2.现在运行查询以添加约束

  1. ALTER TABLE `user_friends`
  2. ADD CONSTRAINT `user_id_key_constraint`
  3. FOREIGN KEY (`user_id`)
  4. REFERENCES `user`(`id`)
  5. ON DELETE CASCADE
  6. ON UPDATE CASCADE;

但正如你所说,你有非常大量的数据,那么我认为你必须建立另一个表,从user表中获取有效的用户ID,并在此基础上,你可以删除或更新user_friends表中的记录。
例如
StepOne

  1. CREATE TEMPORARY TABLE valid_user_ids AS
  2. SELECT DISTINCT id FROM user;

第二步
如果user_friends表中没有user_id,请创建索引。

  1. CREATE INDEX idx_user_id ON user_friends (user_id);

第三步
现在你所要做的就是删除或空的记录,然后添加你的约束删除,你可以使用这样的东西

  1. DELETE FROM user_friends
  2. WHERE user_id NOT IN (SELECT id FROM valid_user_ids);

第四步
现在,只需添加上述第2点中的查询的约束。
提示:-
例如,您可以批量获取数据并相应地更新它们

  1. SELECT id
  2. FROM user_friends
  3. LIMIT ${batchSize}
  4. OFFSET ${offset};

这个查询将返回您必须Map的行数,并从这样的行中获取id const userIDs = rows.map((row) => row.id).join(',');,然后像这样更改StepThree

  1. DELETE FROM user_friends
  2. WHERE user_id NOT IN (SELECT id FROM valid_user_ids) AND id IN
  3. (${userIDs});
展开查看全部
wpx232ag

wpx232ag2#

您所面临的错误表明user_friends表中存在具有user ID的现有记录,而user表中不存在该记录。为了能够实现您想要做的事情,首先确保有效的userId附加到这些用户,或者为这些用户分配空值。
这是你能做的。
1.在user_friends中查找无效的user_id引用

  1. // mysql
  2. SELECT user_friends.user_id
  3. FROM user_friends
  4. LEFT JOIN user ON user_friends.user_id = user.id
  5. WHERE user.id IS NULL;

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

  1. // mysql
  2. UPDATE user_friends
  3. LEFT JOIN user ON user_friends.user_id = user.id
  4. SET user_friends.user_id = NULL
  5. WHERE user.id IS NULL

1.在使用userId设置的值清理user_friends表之后,您应该能够添加外键约束,而不会出现任何错误。

展开查看全部

相关问题