In MySQL, I'm trying to find an efficient way to perform an UPDATE if a row already exists in a table, or an INSERT if the row doesn't exist.
I've found two possible ways so far:
- The obvious one: open a transaction, SELECT to find if the row exists, INSERT if it doesn't exist or UPDATE if it exists, commit transaction
- first INSERT IGNORE into the table (so no error is raised if the row already exists), then UPDATE
The second method avoids the transaction.
Which one do you think is more efficient, and are there better ways (for example using a trigger)?
You could also perform an UPDATE, check the number of rows affected, if it's less than 1, then it didn't find a matching row, so perfom the INSERT.
REPLACE INTO would be a solution, it uses the
UNIQUE INDEX
for replacing or inserting something.Please be aware that this works differently from what you might expect, the
REPLACE
is quite literally. It first checks if there is aUNIQUE INDEX
collision which would prevent anINSERT
, it removes (DELETE
) all rows which collide and thenINSERT
s the row you've given it.This, for example, leads to subtle problems like Triggers not firing (because they check for an update, which never occurs) or values reverted to the defaults (because you must specify all values).
If you're doing a lot of these, it might be worth writing them to a file, and then using '
LOAD DATA INFILE ... REPLACE ...
'INSERT ... ON DUPLICATE KEY UPDATE
There is another way -
REPLACE
.In
mysql
there's aREPLACE
statement that, I believe, does more or less what you want it to do.