INSERT INTO ... SELECT FROM ... on DUPLICATE KEY UPDATE

dna*_*irl 112 mysql insert-update

我正在进行插入查询,如果已经存在唯一键,则需要将大多数列更新为新值.它是这样的:

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
Run Code Online (Sandbox Code Playgroud)

我不确定该UPDATE子句的语法应该是什么.我如何引用该SELECT子句中的当前行?

Mar*_*ams 159

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, ...
Run Code Online (Sandbox Code Playgroud)

  • 您建议的语法有效,并且需要`t`.我还在xaprb(http://www.xaprb.com/blog/2006/02/21/flexible-insert-and-update-in-mysql/)上发现了一篇使用以下语法的文章:`on duplicate key update b =值(b),c =值(c)`.这也有效. (42认同)
  • @john如果SELECT语句具有GROUP BY子句,该怎么办 (11认同)
  • 注意:当SELECT语句具有GROUP BY子句时,这将不起作用 (9认同)
  • @dnagirl:**提示:**不要尝试更新任何PK列,只需要更新的列进入列表 (6认同)
  • http://dev.mysql.com/doc/refman/5.6/en/insert-on-duplicate.html在MySQL 5.6.4及更高版本中说`INSERT ... SELECT ON DUPLICATE KEY UPDATE语句被标记为不安全基于语句的复制...此外,从MySQL 5.6.6开始,针对具有多个唯一或主键的表的INSERT ... ON DUPLICATE KEY UPDATE语句也被标记为不安全. (2认同)

iCu*_*ous 45

虽然我已经很晚了但是在为那些想要使用INSERT-SELECT查询GROUP BY条款的人看到一些合理的问题后,我想出了解决这个问题的方法.

进一步考虑马库斯亚当斯的答案和会计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, ...
Run Code Online (Sandbox Code Playgroud)

  • 对于使用COUNT,GROUP等的查询,这是正确的答案.谢谢. (7认同)