如果存在则更新,否则插入到MySQL表中

1151

我想要向数据库表中添加一行数据,但如果已经存在具有相同唯一键的行,则我希望更新该行。

例如:

INSERT INTO table_name (ID, NAME, AGE) VALUES(1, "A", 19);

假设唯一键值是ID,在我的数据库中有一行ID=1。那么,在这种情况下,我希望使用这些值来更新该行数据。通常这将引发一个错误。
如果我使用INSERT IGNORE,它会忽略错误,但仍然不会更新数据。


15
SQL需要一个官方语法来解决这种情况,该语法不会强制在语法中重复值并且可以保留主键。 - Pete Alvin
1
要获取受影响的ID,请参考MySQL ON DUPLICATE KEY - last insert id? - LF00
1
注意:从版本5.7开始,此方法不直接支持WHERE子句作为INSERT / UPDATE操作的一部分。此外,更新实际上计为两个单独的操作(删除和插入)...如果这对审计目的有影响的话。(Learnbit) - dreftymac
12个回答

5

在我的情况下,我创建了以下查询语句,但是在第一个查询中,如果id 1已经存在并且已经有age,那么如果您在没有age 的情况下创建第一个查询,则age的值将为none

REPLACE into table SET `id` = 1, `name` = 'A', `age` = 19

为避免上述问题,请创建以下查询:
INSERT INTO table SET `id` = '1', `name` = 'A', `age` = 19 ON DUPLICATE KEY UPDATE `id` = "1", `name` = "A",`age` = 19

也许这会对你有所帮助...


6
有人知道为什么我们必须两次分配值吗?为什么MySQL不允许我们在ON DUPLICATE KEY UPDATE结束查询而不复制所有分配语句?一些数据库表有很多列,这似乎是冗余/过度的。我理解为什么我们有备用分配选项,但为什么不也有省略它们的选项呢?只是好奇是否有人知道。 - user2607743

4

以下是一些可能的方法:

使用INSERT INTO

INSERT语句允许您将一行或多行插入到表中。

  • 首先,在INSERT INTO子句之后指定表名和一个用逗号分隔的列列表。
  • 其次,在VALUES关键字后面的括号内放置相应列的逗号分隔值列表。
INSERT INTO table_name(column_name1, column_name2, column_name3) VALUES("col_value_1", "col_value_2", "col_value_3");

使用带有 WHERE NOT EXISTS 子句的 INSERT INTO

INSERT INTO table_name (column_name_1, column_name_2, column_name_3)
SELECT * FROM (SELECT "col_value_1", "col_value_2","col_value_3") AS tmp_name
WHERE NOT EXISTS (
    SELECT column_name2 FROM table_name WHERE column_name = "sample_name"
) LIMIT 1;

使用REPLACE INTO

REPLACEINSERT完全相同,唯一不同的是,如果表中的旧行具有与PRIMARY KEY或UNIQUE索引的新行相同的值,则在插入新行之前删除旧行。

REPLACE INTO table_name(column_name1, column_name2, column_name3) VALUES("col_value_1", "col_value_2", "col_value_3");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接