代码之家  ›  专栏  ›  技术社区  ›  dnagirl

插入到…从…中选择重复的密钥更新

  •  105
  • dnagirl  · 技术社区  · 16 年前

    我正在执行一个插入查询,如果已经存在唯一键,那么许多列中的大多数都需要更新为新值。就像这样:

    INSERT INTO lee(exp_id, created_by, 
                    location, animal, 
                    starttime, endtime, entct, 
                    inact, inadur, inadist, 
                    smlct, smldur, smldist, 
                    larct, lardur, lardist, 
                    emptyct, emptydur)
    SELECT id, uid, t.location, t.animal, t.starttime, t.endtime, t.entct, 
           t.inact, t.inadur, t.inadist, 
           t.smlct, t.smldur, t.smldist, 
           t.larct, t.lardur, t.lardist, 
           t.emptyct, t.emptydur 
    FROM tmp t WHERE uid=x
    ON DUPLICATE KEY UPDATE ...; 
    //update all fields to values from SELECT, 
    //       except for exp_id, created_by, location, animal, 
    //       starttime, endtime
    

    我不确定 UPDATE 子句应为。如何引用 SELECT 条款?

    2 回复  |  直到 11 年前
        1
  •  147
  •   Marcus Adams    16 年前

    MySQL将假定equals前面的部分引用insert into子句中命名的列,而第二部分引用select列。

    INSERT INTO lee(exp_id, created_by, location, animal, starttime, endtime, entct, 
                    inact, inadur, inadist, 
                    smlct, smldur, smldist, 
                    larct, lardur, lardist, 
                    emptyct, emptydur)
    SELECT id, uid, t.location, t.animal, t.starttime, t.endtime, t.entct, 
           t.inact, t.inadur, t.inadist, 
           t.smlct, t.smldur, t.smldist, 
           t.larct, t.lardur, t.lardist, 
           t.emptyct, t.emptydur 
    FROM tmp t WHERE uid=x
    ON DUPLICATE KEY UPDATE entct=t.entct, inact=t.inact, ...
    
        2
  •  35
  •   iCurious    11 年前

    虽然我已经很晚了,但是在看到一些合法的问题之后 INSERT-SELECT 查询 GROUP BY 我想出了解决这个问题的办法。

    进一步回答 马库斯·亚当 和会计 分组依据 在它中,这就是我如何通过使用 Subqueries in the FROM Clause

    INSERT INTO lee(exp_id, created_by, location, animal, starttime, endtime, entct, 
                    inact, inadur, inadist, 
                    smlct, smldur, smldist, 
                    larct, lardur, lardist, 
                    emptyct, emptydur)
    SELECT sb.id, uid, sb.location, sb.animal, sb.starttime, sb.endtime, sb.entct, 
           sb.inact, sb.inadur, sb.inadist, 
           sb.smlct, sb.smldur, sb.smldist, 
           sb.larct, sb.lardur, sb.lardist, 
           sb.emptyct, sb.emptydur
    FROM
    (SELECT id, uid, location, animal, starttime, endtime, entct, 
           inact, inadur, inadist, 
           smlct, smldur, smldist, 
           larct, lardur, lardist, 
           emptyct, emptydur 
    FROM tmp WHERE uid=x
    GROUP BY location) as sb
    ON DUPLICATE KEY UPDATE entct=sb.entct, inact=sb.inact, ...
    
    推荐文章