【问题标题】:Replace Database field based on 2 different Table Conditions根据 2 个不同的表条件替换数据库字段
【发布时间】:2019-10-31 03:36:03
【问题描述】:

我需要根据电子邮件匹配条件更新表,并且需要知道可以解决此问题的 SQL 查询。

我有 2 个表“old_data”和“new_data”

Old_data contains around 60,000 records and fields "EMAIL"
New_data contains around 90,000 records and fields "EMAIL" "WHITE_NO"

这是我需要帮助的逻辑条件。

Update * from Old_data, New_data SET New_data.WHITE_NO = 'true' WHERE old_data.EMAIL = New_data.EMAIL

它将在 old_data 表中查找所有电子邮件,并将它们与所有相同的电子邮件匹配到 new_data 表中,并将 WHITE_NO 字段值替换为 true。

【问题讨论】:

    标签: mysql sql database conditional-statements


    【解决方案1】:
    UPDATE new_data
           JOIN old_data
           ON new_data.EMAIL = old_data.EMAIL
    SET    new_data.WHITE_NO = 'true';
    

    UPDATE new_data
    SET new_data.WHITE_NO ='true'
    WHERE new_data.EMAIL IN (SELECT EMAIL FROM old_data);
    

    【讨论】:

    • 在 100 万条记录中,哪种方式运行速度更快?我正在使用 tableplus 和 phpmyadmin,两者都很慢并且需要很多小时
    • 如果两者都很慢你可以试试,但我不确定性能 UPDATE new_data JOIN old_data ON new_data.EMAIL = old_data.EMAIL AND new_data.WHITE_NO !='true' SET new_data.WHITE_NO = 'true' 限制 10000;并在 white_no 上建立索引。
    • 我使用的声明与您在评论中所写的相同。这里我只是使用内连接而不是连接,但它也太慢了
    • 我们可以尝试将 white_no 字段设为布尔值而不是字符串并使其成为索引。并执行有限制的查询。
    • 表中应该有一些主键,以便我们可以在where子句中使用它来执行部分查询
    【解决方案2】:

    您需要通过 2 个表的连接进行更新:

    update New_data
    inner join old_data on old_data.EMAIL = New_data.EMAIL
    set New_data.WHITE_NO = 'true'
    

    【讨论】:

    • 我试过了,但是超过100万条记录太慢了,有什么办法可以让它更快?
    • 内连接是实现它的方法,唯一可以提高性能的情况是两个 EMAIL 列都有索引。
    • 我可以为两个数据库上的电子邮件字段设置索引吗?
    • 不,您需要:ALTER TABLE old_data ADD INDEX idx_old_email(EMAIL);ALTER TABLE New_data ADD INDEX idx_new_email(EMAIL);。你可以在这里找到更多:dev.mysql.com/doc/refman/8.0/en/create-index.html
    • 对,一旦我为两个表上的两个电子邮件字段创建了索引,如何调用索引以使它们匹配值并将值设置为字段?
    猜你喜欢
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 2021-07-20
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    相关资源
    最近更新 更多