Mysql 插入到。。。从…中选择。。。关于重复密钥更新
我正在执行一个insert查询,如果已经存在唯一键,那么许多列中的大多数都需要更新为新值。事情是这样的: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 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和其中的accountingGROUP 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)