比较2个表并插入不完全匹配的行

时间:2017-10-28 17:21:20

标签: mysql sql database mariadb

我有两个大致如下的用户表。

users_old    
| id | email          | hash | salt |
+----+----------------+------+------+
|  1 | bob@email.com  | 1234 | abc  |
|  2 | jane@email.com | 5678 | def  |
|  3 | josh@email.com | 9123 | ghi  |
|  4 | mike@email.com | 4567 | jki  |

users   
| id | email          | hash | salt |
+----+----------------+------+------+
|  1 | bob@email.com  | 1234 | abc  |
|  2 | jane@email.com | 8662 | zsq  | <--- different
|  3 | josh@email.com | 9123 | ghi  |
|  4 | mike@email.com | 4567 | jki  |
|  5 | karl@email.com | 8912 | xrz  | <--- new

您可以看到 users_old 包含 id 电子邮件哈希 salt 。但是 - 用户表在末尾包含相同的条目+新条目,并且一些原始条目具有不同的散列+盐。

我要做的是通过添加用户表中的新条目来更新 users_old 表,并查看哪些条目具有不同的哈希+盐组合并添加表格末尾的那些也作为一个新条目(即使电子邮件是相同的。所以最终结果应该只是一个表

users_old    
| id | email          | hash | salt |
+----+----------------+------+------+
|  1 | bob@email.com  | 1234 | abc  |
|  2 | jane@email.com | 5678 | def  |
|  3 | josh@email.com | 9123 | ghi  |
|  4 | mike@email.com | 4567 | jki  |
|  5 | karl@email.com | 8912 | xrz  |
|  6 | jane@email.com | 8662 | zsq  |

是否有一个查询可以实现这一目标?

1 个答案:

答案 0 :(得分:0)

我想你想要:

insert into users_old(email, hash, salt)
    select email, hash, salt
    from users u
    where not exists (select 1
                      from users_old uo
                      where uo.email = u.email and uo.hash = u.hash and
                            uo.salt = u.salt
                     );