多行插入和主键的重复键

时间:2017-10-26 09:12:40

标签: mysql

在mysql中,我目前正在使用如下的插入语句(uid是主键)

INSERT INTO test ( uid, datetime, precip, sds ) VALUES (?,?,?,?) on duplicate key update uid = "<uid>";

现在,我需要在mysql中执行多行插入。我需要检查uid是否已经存在,更新else插入。由于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>);

1 个答案:

答案 0 :(得分:0)

您的问题不明确,有两种解释:

第一种解释

如果主UID已存在于数据库中,您希望使用备用UID创建新行。

这看起来像你写的正确解释&#34;每个新行包含一个新的uid&#34;。但这看起来并不自然。

为此,ON DUPLICATE KEY UPDATE不是正确的工具,因为update现有的原始文件,如其名称所示,不会创建新的原始文件。

因此,为了实现这一点,您可以正常insert,检查插入是否成功,如果由于重复的uid导致失败,请插入替代uid。如果再次发生冲突,不知道你想做什么,在循环中运行它?看起来错误的方式。

第二种解释

如果存在具有相同uid的行,则要更新,否则插入新行。换句话说,您希望插入一个新行,但只更新现有的行。

这看起来就像你写的那样正确的解释&#34;我需要检查uid是否已经存在,更新其他插入&#34;并且当您尝试使用&#34;在重复键更新时#34;。它看起来也更自然。

要实现这一点,您可以使用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语句不会更改。

它读取&#34;如果该行存在,则更新日期时间,沉淀和sds&#34;。