2009-09-29 42 views
4

在MySQL中,我试图找到一种有效的方式来执行一个UPDATE,如果一行中已经存在一个表或INSERT如果行不'不存在。执行更新或插入取决于MySQL中是否存在行

我发现了两种可能的方式至今:

  1. 最明显的一个:打开一个交易,SELECT找到,如果行存在,INSERT,如果它不存在或UPDATE如果存在的话,犯交易
  2. 第一INSERT IGNORE到表(因此,如果该行已经存在升高没有错误),然后更新

第二种方法避免了该事务。

哪一个你认为更有效率,并有更好的方法(例如使用触发器)?

+2

我曾经听说过这被称为Upserting。我发现它是一个很好的简洁的术语。由于某种原因,它使我咯咯地笑。 – 2009-09-29 14:12:37

+0

@MikeTwo也让我咯咯笑起来,可能'因为它听起来像掀裙:) – nawfal 2012-04-02 08:48:16

回答

11
+0

如果任何一个字段匹配或只有键/唯一字段,是否更新更新密钥更新? – user97410 2009-09-29 14:14:27

+0

仅当匹配唯一/主键索引中的条目时才被激活。 – 2009-09-29 15:21:33

+0

真的很棒 – user97410 2009-09-29 20:53:25

3

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

2

mysql有一个REPLACE声明的是,我相信,确实或多或少你想要它做的事情。

1

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

3

还有另一种方式 - REPLACE

REPLACE INTO myTable (col1) VALUES (value1) 

更换作品酷似INSERT,不同之处在于,如果一个老行的表具有相同的值作为一个主键或唯一索引的新行,旧行的新行之前删除被插入。 See Section 12.2.5, “INSERT Syntax”

2

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

REPLACE INTO 
    yourTable 
SET 
    column = value; 

请注意,这个作品不同于你所期望的是什么,该REPLACE是毫不夸张。它首先检查是否存在会阻止INSERT的碰撞,它会删除(DELETE)所有碰撞的行,然后删除所给的行。例如,这会导致触发器不会触发的细微问题(因为它们会检查更新,这种情况永远不会发生),或者将值恢复为默认值(因为您必须指定所有值)。

相关问题