Mysql 插入到。。。从…中选择。。。关于重复密钥更新

Mysql 插入到。。。从…中选择。。。关于重复密钥更新,mysql,insert-update,Mysql,Insert Update,我正在执行一个insert查询,如果已经存在唯一键,那么许多列中的大多数都需要更新为新值。事情是这样的: INSERT INTO lee(exp_id, created_by, location, animal, starttime, endtime, entct, inact, inadur, inadist, smlct, smldur, smldist,

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

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
子句中的当前行?

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, ...

虽然我做得很晚,但在看到一些针对那些想使用
INSERT-SELECT
查询
groupby
子句的人的合理问题后,我想出了解决方法

进一步回答Marcus Adams和其中的accounting
GROUP BY
,这就是我如何使用


当SELECT语句有GROUPBY子句时

    ....
    ON DUPLICATE KEY UPDATE    
    larct=VALUES(larct), lardur=VALUES(lardur),lardist= 
    VALUES(lardist)

@dnagirl:提示:不要尝试更新任何PK列,只有那些需要更新的列才会进入列表。建议的语法有效,并且需要
t.
。我还发现了一篇关于xaprb()的文章,其中使用了以下语法:
关于重复键更新b=values(b),c=values(c)
。这也可以。注意:当SELECT语句有GROUP BY时,这将不起作用clause@john如果SELECT语句有一个GROUPBY子句,上面写着“在MySQL 5.6.4及更高版本中,插入…”,该怎么办。。。重复键上选择更新语句对于基于语句的复制被标记为不安全。。。此外,从MySQL 5.6.6开始,插入。。。针对具有多个唯一键或主键的表的ON DUPLICATE KEY UPDATE语句也被标记为不安全。这是使用COUNT、GROUP等查询的正确答案。。谢谢,非常感谢你,伙计!我真的很喜欢这种方法,特别是因为它允许我创建一种类似连续查询的机制,这是XDB所做的
    ....
    ON DUPLICATE KEY UPDATE    
    larct=VALUES(larct), lardur=VALUES(lardur),lardist= 
    VALUES(lardist)