合并行并更新相关的外键

时间:2019-05-29 17:24:49

标签: mysql

我有一个当前的users表。唯一的用户定义为emailphoneNumber在一起唯一时。当前,该表如下所示:

enter image description here

还有另一个名为giftee_info的表,该表在列userIdusers.id上具有外键:

enter image description here

users表将被解析为2个表:usersuser_metadata。现在,phoneNumber将定义一个不同的用户。因此,您可以在上面的数据中看到,ID为4和5的用户是相同的,必须合并。

新的users表将如下所示:

enter image description here

新的user_metadata表将如下所示:

enter image description here

请注意第四行的userId为4,因此用户4和5已合并为一个用户。

giftee_info看起来像这样:

enter image description here

查看giftee_info中的第三行如何包含userId 4,因为ID为5的用户已合并为一个用户。

我提供的数据是基本的。实际上,有许多行,并且具有相同编号的用户可能具有5个不同的电子邮件地址(因此当前在当前架构中被视为单独的用户)。

我最麻烦的部分是更新giftee_info。因此,任何具有userId的行都已合并为一个用户,则需要更新。我该怎么办?

1 个答案:

答案 0 :(得分:0)

由于phonenumber可以是NULL,因此我将externalid用作下面的唯一标识符。

首先从旧users表中的不同电话号码创建新的users表:

CREATE TABLE new_users (id INT PRIMARY KEY AUTO_INCREMENT, externalid VARCHAR(32), phonenumber VARCHAR(32))
SELECT DISTINCT NULL, externalid, phonenumber
FROM users

然后,通过将旧的和新的user_metadata表联接在一起,将所有电子邮件放入users表中,以获取电子邮件以及新的用户ID。

CREATE TABLE user_metadata (id INT PRIMARY KEY AUTO_INCREMENT, userid INT, email VARCHAR(100), subscribe INT(1))
SELECT NULL, nu.id, u.email, 0
FROM new_users as nu
JOIN users AS u ON nu.externalid = u.externalid

现在,您可以通过将旧的用户ID替换为新的用户ID来更新giftee_info

UPDATE giftee_info AS g
JOIN users as u ON g.userid = u.userid
JOIN new_users As nu ON nu.externalid = u.externalid
SET g.userid = nu.userid

完成所有操作后,您可以重命名表,因此new_users现在为users