INSERT ... ON DUPLICATE KEY (do nothing)
Solution 1:
Yes, use INSERT ... ON DUPLICATE KEY UPDATE id=id
(it won't trigger row update even though id
is assigned to itself).
If you don't care about errors (conversion errors, foreign key errors) and autoincrement field exhaustion (it's incremented even if the row is not inserted due to duplicate key), then use INSERT IGNORE
like this:
INSERT IGNORE INTO <table_name> (...) VALUES (...)
Solution 2:
HOW TO IMPLEMENT 'insert if not exist'?
1. REPLACE INTO
pros:
- simple.
cons:
too slow.
auto-increment key will CHANGE(increase by 1) if there is entry matches
unique key
orprimary key
, because it deletes the old entry then insert new one.
2. INSERT IGNORE
pros:
- simple.
cons:
auto-increment key will not change if there is entry matches
unique key
orprimary key
but auto-increment index will increase by 1some other errors/warnings will be ignored such as data conversion error.
3. INSERT ... ON DUPLICATE KEY UPDATE
pros:
- you can easily implement 'save or update' function with this
cons:
looks relatively complex if you just want to insert not update.
auto-increment key will not change if there is entry matches
unique key
orprimary key
but auto-increment index will increase by 1
4. Any way to stop auto-increment key increasing if there is entry matches unique key
or primary key
?
As mentioned in the comment below by @toien: "auto-increment column will be effected depends on innodb_autoinc_lock_mode
config after version 5.1" if you are using innodb
as your engine, but this also effects concurrency, so it needs to be well considered before used. So far I'm not seeing any better solution.
Solution 3:
Use ON DUPLICATE KEY UPDATE ...
,
Negative : because the UPDATE
uses resources for the second action.
Use INSERT IGNORE ...
,
Negative : MySQL will not show any errors if something goes wrong, so you cannot handle the errors. Use it only if you don’t care about the query.