在MySQL中,我试图找到一种有效的方式来执行一个UPDATE,如果一行中已经存在一个表或INSERT如果行不'不存在。执行更新或插入取决于MySQL中是否存在行
我发现了两种可能的方式至今:
- 最明显的一个:打开一个交易,SELECT找到,如果行存在,INSERT,如果它不存在或UPDATE如果存在的话,犯交易
- 第一INSERT IGNORE到表(因此,如果该行已经存在升高没有错误),然后更新
第二种方法避免了该事务。
哪一个你认为更有效率,并有更好的方法(例如使用触发器)?
在MySQL中,我试图找到一种有效的方式来执行一个UPDATE,如果一行中已经存在一个表或INSERT如果行不'不存在。执行更新或插入取决于MySQL中是否存在行
我发现了两种可能的方式至今:
第二种方法避免了该事务。
哪一个你认为更有效率,并有更好的方法(例如使用触发器)?
您也可以执行UPDATE,检查受影响的行数,如果它小于1,那么它没有找到匹配的行,因此执行INSERT。
在mysql
有一个REPLACE
声明的是,我相信,确实或多或少你想要它做的事情。
如果你做了很多的这些,它可能是值得他们写入到文件,然后使用“LOAD DATA INFILE ... REPLACE ...
”
还有另一种方式 - REPLACE
。
REPLACE INTO myTable (col1) VALUES (value1)
更换作品酷似INSERT,不同之处在于,如果一个老行的表具有相同的值作为一个主键或唯一索引的新行,旧行的新行之前删除被插入。 See Section 12.2.5, “INSERT Syntax”。
REPLACE INTO将是一个解决方案,它使用UNIQUE INDEX
替换或插入的东西。
REPLACE INTO
yourTable
SET
column = value;
请注意,这个作品不同于你所期望的是什么,该REPLACE
是毫不夸张。它首先检查是否存在会阻止INSERT
的碰撞,它会删除(DELETE
)所有碰撞的行,然后删除所给的行。例如,这会导致触发器不会触发的细微问题(因为它们会检查更新,这种情况永远不会发生),或者将值恢复为默认值(因为您必须指定所有值)。
我曾经听说过这被称为Upserting。我发现它是一个很好的简洁的术语。由于某种原因,它使我咯咯地笑。 – 2009-09-29 14:12:37
@MikeTwo也让我咯咯笑起来,可能'因为它听起来像掀裙:) – nawfal 2012-04-02 08:48:16