在 MySQL 中,如果存在如何更新,如果不存在则插入(又名“upsert”或“merge”)?
有没有一种简单的方法可以使用一个 MySQL 查询来在行不存在时插入行或更新行(如果存在)?
Is there an easy way to INSERT
a row when it does not exist, or to UPDATE
if it exists, using one MySQL query?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
使用
INSERT ... ON DUPLICATE KEY UPDATE< /代码>
。 例如:
Use
INSERT ... ON DUPLICATE KEY UPDATE
. For example:我知道这是一个老问题,但谷歌最近把我带到了这里,所以我想其他人也会来这里。
@chaos是正确的:有
INSERT 。 .. ON DUPLICATE KEY UPDATE
语法。然而,最初的问题专门询问了 MySQL,在 MySQL 中有 <代码>REPLACE INTO ... 语法。 恕我直言,这个命令对于更新插入来说更容易、更直接。 从手册:
请注意,这不是标准 SQL。 手册中的一个示例:
编辑:只是一个合理的警告,
REPLACE INTO
与UPDATE
不同。 正如手册所述,REPLACE
会删除该行(如果存在),然后插入一个新行。 (请注意上面示例中有趣的“受影响的 2 行”。)也就是说,它将替换现有记录的所有列的值(而不仅仅是更新某些列。)MySQL 的REPLACE INTO
行为与 Sqlite 的INSERT OR REPLACE INTO
非常相似。 如果您只想更新几列( (并非所有列)如果记录已存在。I know this is an old question, but the Google lead me here recently so I imagine others come here, too.
@chaos is correct: there is the
INSERT ... ON DUPLICATE KEY UPDATE
syntax.However, the original question asked about MySQL specifically, and in MySQL there is the
REPLACE INTO ...
syntax. IMHO, this command is easier and more straightforward to use for upserts. From the manual:Note this is not standard SQL. An example from the manual:
Edit: Just a fair warning that
REPLACE INTO
isn't likeUPDATE
. As the manual says,REPLACE
deletes the row if it exists, then inserts a new one. (Note the funny "2 rows affected" in the example above.) That is, it will replace the values of all columns of an existing record (and not merely update some columns.) The behavior of MySQL'sREPLACE INTO
is much like that of Sqlite'sINSERT OR REPLACE INTO
. See this question for some workarounds if you only want to update a few columns (and not all columns) if the record already exists.