【问题标题】:Optimize MySQL query for update?优化 MySQL 查询以进行更新?
【发布时间】:2017-12-30 04:19:45
【问题描述】:

我有两个同一个数据库的表,比如说 D,两个表是 T1 和 T2。 T1 具有属性 a1,a2...an 并且 t2 具有属性 a1,a2。我想要一个查询,仅当 T1.a1=T2.a1 时才可以用 T2 的值更新 T1 的值,否则插入到 T1 中。示例:

enter image description here

【问题讨论】:

    标签: mysql


    【解决方案1】:

    选项

    您至少有三个选项:

    • 删除镜像表,然后运行create as select 重新创建表
    • 使用 mysql replace into 语法(参见:Replace Into Query Syntax
    • 将您的问题拆分为两个查询:一个更新和一个插入查询

    要遵循的示例和详细信息...

    创建为选择

    drop table t1;
    create table t1 as select * from t2;
    

    替换成

    将 t1.a1 和 t2.a1 设置为两个表的主键。 运行:

    Replace into t1(a1,a2) select a1, a2 from t2;
    

    使用更新和插入:

    UPDATE t1
    INNER JOIN t2 ON t1.a1 = t2.a1
    SET t1.a2 = t2.a2 where t1.a1 = t2.a1;
    
    insert into t1(a1, a2) select a1, s2 from t2 where t2.a1 not in (select a1 from t1);
    

    【讨论】:

    • 嘿,谢谢你的回答,但你能给出更新和插入的更新查询吗
    • 嘿,再次感谢。我的最后一个查询是我是否从 t2 中删除了一个在 t1 中没有更新的元组。 T1 仍然具有旧的 t2 值。顺便说一句,这仅适用于 T2 中元组删除的情况。我正在使用更新和插入查询
    • delete from t1 where not exists (select 1 from t2 where t2.a1 = t1.a1)
    【解决方案2】:

    你可以试试这样的:

    INSERT INTO T1 (you columns list) VALUES (here select your values from T2 with restriction) ON DUPLICATE KEY UPDATE `a2`=values(`a2`)
    

    【讨论】:

    • 好的,我会尝试,但你能帮我一个忙,并以正式查询的形式写出来
    • INSERT INTO T1 (a1, a2) VALUES (SELECT a1, a2 FROM T2) ON DUPLICATE KEY UPDATE a2=values(a2); 我以为 a1 是你的表 T1 的主键。
    【解决方案3】:

    这是我理解问题的方式的回答。如果这不是您想要的,也许您可​​以澄清一下。在问题 a1 和 a2 看起来像表中的字段。但是,在您的输出期望中,它们看起来像另一列的值。

    insert t1(a1,a2,a3)
    select t2.a1,t2.a2,t2.a3 from t2
    left join t1 on t1.a1 = t2.a2
    where t1.a1 is null
    
    update t1
    set t1.a1 = t2.a1, t1.a2 = t2.a2, t1.a3 = t2.a3
    from t1 inner join t2 on t1.a1 = t2.a2
    
    /*
        table data before record changes
        t1
        a1         a2         a3
        ---------- ---------- ----------
        bar        foo        fizz
        yin        yang       zen
        vidi       vini       vici
        lug        lag        lugger
        dig        dug        digger
        zoom       zimm       zammy
        riki       tiki       tavi
        yuz        wuz        wiz
        bip        bap        boop
        zip        zap        zing
        ding       aling      aling
    
    
        t2
        a1         a2         a3
        ---------- ---------- ----------
        foo        bar        fizz
        yuz        wuz        wiz
        vini       vidi       vici
        bip        bap        boop
        zip        zap        zing
        ding       aling      aling
        zimm       zoom       zumm
    
    
    
        t1 data after record changes
        t1
        a1         a2         a3
        ---------- ---------- ----------
        foo        bar        fizz
        yin        yang       zen
        vini       vidi       vici
        lug        lag        lugger
        dig        dug        digger
        zimm       zoom       zumm
        riki       tiki       tavi
        yuz        wuz        wiz
        bip        bap        boop
        zip        zap        zing
        ding       aling      aling
        yuz        wuz        wiz
        bip        bap        boop
        zip        zap        zing
        ding       aling      aling
    
    */
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      相关资源
      最近更新 更多