在mysql中,我目前有一个insert语句,如下所示(uid是主键)
INSERT INTO test ( uid, datetime, precip, sds ) VALUES (?,?,?,?) on duplicate key update uid = "<uid>";现在,我需要在mysql中执行多行插入。我需要检查uid是否已经存在,update else insert。由于uid是一个主键,因此每个新行都包含一个新的uid。请让我知道下面的语法是否正确?
INSERT INTO test ( uid, datetime, precip, sds ) VALUES (?,?,?,?), (?,?,?,?), (?,?,?,?), (?,?,?,?), (?,?,?,?) on duplicate key update uid = values(<uid for first record>), uid = values(<uid for second record>), uid = values(<uid for third record>), uid = values(<uid for fourth record>);发布于 2017-10-26 20:15:50
你的问题不清楚,有两种解释:
第一次解释
如果数据库中已存在主UID,则需要使用备用UID创建新行。
这看起来像你写的“每个新行都包含一个新的uid”的正确解释。但这看起来一点也不自然。
在这方面,ON DUPLICATE KEY UPDATE不是正确的工具,因为它将update现有的原始数据,正如其名称所示,而不是创建新的原始数据。
因此,要实现这一点,您可以正常插入,检查插入是否成功,如果由于重复的uid而失败,则使用备用uid插入。如果它再次冲突,你不确定你想要做什么,在循环中运行它?看起来方向不对。
第二种解释
如果存在具有相同uid的行,则希望进行更新,否则插入一个新的。换句话说,您希望插入一个新行,但只更新现有行(如果它存在)。
这看起来像你写的“我需要检查uid是否已经存在,更新否则插入”和你正在尝试的“在重复键更新上”一样正确的解释。而且它看起来更自然。
要实现这一点,您可以使用ON DUPLICATE KEY UPDATE使用新值update现有行(但不要接触uid),如下所示:
INSERT INTO test ( uid, datetime, precip, sds )
VALUES (?,?,?,?)
ON DUPLICATE KEY UPDATE
datetime = VALUES(datetime),
precip = VALUES(precip),
sds = VALUES(sds)当您有多个值时,ON DUPLICATE KEY UPDATE语句不会更改。
它显示为“如果该行存在,请更新日期时间、精确度和sds”。
https://stackoverflow.com/questions/46950256
复制相似问题