我有一个当前的users
表。唯一的用户定义为email
和phoneNumber
在一起唯一时。当前,该表如下所示:
还有另一个名为giftee_info
的表,该表在列userId
到users.id
上具有外键:
users
表将被解析为2个表:users
和user_metadata
。现在,phoneNumber
将定义一个不同的用户。因此,您可以在上面的数据中看到,ID为4和5的用户是相同的,必须合并。
新的users
表将如下所示:
新的user_metadata
表将如下所示:
请注意第四行的userId
为4,因此用户4和5已合并为一个用户。
giftee_info
看起来像这样:
查看giftee_info
中的第三行如何包含userId 4,因为ID为5的用户已合并为一个用户。
我提供的数据是基本的。实际上,有许多行,并且具有相同编号的用户可能具有5个不同的电子邮件地址(因此当前在当前架构中被视为单独的用户)。
我最麻烦的部分是更新giftee_info
。因此,任何具有userId
的行都已合并为一个用户,则需要更新。我该怎么办?
答案 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
。