【问题标题】:SQL - Syncing Denormalize TableSQL - 同步非规范化表
【发布时间】:2014-10-03 20:53:14
【问题描述】:

我有一个USERS 表和一个LOGS 表。 LOGS 表被规范化,只存储了一个 user_id,直到最近,当我出于性能原因决定对其进行非规范化时。在此更改之后,usernameuser_role 列也作为 LOGS 表的一部分。

现在我需要更新LOGS表的现有记录,根据user_id列的值填写usernameuser_role列,使数据变得一致。如何才能实现这一目标?我正在寻找可以在数据库服务器上运行的可能的 SQL 脚本。

阿西姆

【问题讨论】:

    标签: mysql sql denormalization


    【解决方案1】:

    使用类似的东西。你可以加入用户表

    UPDATE LOGS l
    INNER JOIN users u ON u.id=l.user_id
    SET l.username=u.name,
      l.user_role=u.role
    WHERE ... if necessary
    

    更新:

    UPDATE LOGS l
    INNER JOIN (select l.id as log_id, u.*
                from logs l join users u ON u.id=l.user_id
                order by l.id
                limit 10) sub ON sub.id=l.id
    SET l.username=sub.name,
      l.user_role=sub.role
    

    【讨论】:

    • 非常感谢。它是如此简单,以至于它很漂亮。 :)
    • 一个后续问题.. 我注意到 sql ORDER BYLIMIT 子句不适用于这种类型的查询(更新 + 连接).. 它适用于标准或加入 @987654325 @query.. 我怎样才能用这个查询强加一个LIMIT
    • 它可以工作.. 但是如果我想根据LOGS 表进行限制和订购,LOGS 表将变为只读视图.. 并且更新失败..
    • hmm...其实你可以加入(选择LOGS.id作为logs_id,*从LOGS加入用户)sub ON sub.log_id=l.id
    • 很抱歉,但我无法让它工作,你能好心地列出完整的查询吗?我需要以 X 行的批次更新 LOGS 表,同时将其与其他表连接。这是我现在的查询。UPDATE LOGS l LEFT JOIN users u ON u.id = l.user_id SET l.username = u.username, l.user_role = u.user_role WHERE l.username IS NULL
    猜你喜欢
    • 2012-12-31
    • 2013-11-21
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多