根据MySQL中是否存在行执行UPDATE或INSERT

时间:2009-09-29 14:04:07

标签: mysql insert sql-update

在MySQL中,我试图找到一种有效的方法来执行UPDATE如果表中已存在行,或者如果该行不存在则执行INSERT。

到目前为止,我找到了两种可能的方法:

  1. 显而易见的一个:打开事务,SELECT查找行是否存在,如果不存在则INSERT,如果存在则为INSDATE,提交事务
  2. 首先将INSERT IGNORE插入表中(如果该行已存在则不会引发错误),然后更新
  3. 第二种方法避免了交易。

    您认为哪一种更有效,并且有更好的方法(例如使用触发器)?

6 个答案:

答案 0 :(得分:11)

答案 1 :(得分:3)

你也可以执行UPDATE,检查受影响的行数,如果它小于1,那么它没有找到匹配的行,所以执行INSERT。

答案 2 :(得分:3)

还有另一种方式 - REPLACE

REPLACE INTO myTable (col1) VALUES (value1)
  

REPLACE的工作方式与INSERT完全相同,只是如果表中的旧行与PRIMARY KEY或UNIQUE索引的新行具有相同的值,则在插入新行之前删除旧行。 See Section 12.2.5, “INSERT Syntax”

答案 3 :(得分:2)

mysql中,有REPLACE声明,我相信,它或多或少会做你想要的事情。

答案 4 :(得分:2)

REPLACE INTO将是一个解决方案,它使用UNIQUE INDEX替换或插入内容。

REPLACE INTO
    yourTable
SET
    column = value;

请注意,这与您的预期不同,REPLACE完全符合字面意思。它首先检查是否存在阻止UNIQUE INDEX的{​​{1}}碰撞,它会移除(INSERT)所有碰撞的行,然后DELETE你给出的行它

例如,这会导致触发器未触发等微妙问题(因为它们检查更新,从未发生过更新)或值恢复为默认值(因为您必须指定所有值)。

答案 5 :(得分:1)

如果你做了很多这些,可能值得将它们写入文件,然后使用“LOAD DATA INFILE ... REPLACE ...