If you already have a unique or primary key, the other answers with either INSERT INTO ... ON DUPLICATE KEY UPDATE ...
or REPLACE INTO ...
should work fine (note that replace into deletes if exists and then inserts - thus does not partially update existing values).
But if you have the values for some_column_id
and some_type
, the combination of which are known to be unique. And you want to update some_value
if exists, or insert if not exists. And you want to do it in just one query (to avoid using a transaction). This might be a solution:
INSERT INTO my_table (id, some_column_id, some_type, some_value)
SELECT t.id, t.some_column_id, t.some_type, t.some_value
FROM (
SELECT id, some_column_id, some_type, some_value
FROM my_table
WHERE some_column_id = ? AND some_type = ?
UNION ALL
SELECT s.id, s.some_column_id, s.some_type, s.some_value
FROM (SELECT NULL AS id, ? AS some_column_id, ? AS some_type, ? AS some_value) AS s
) AS t
LIMIT 1
ON DUPLICATE KEY UPDATE
some_value = ?
Basically, the query executes this way (less complicated than it may look):
WHERE
clause match.s
), where the column values are explicitly given (s.id is NULL, so it will generate a new auto-increment identifier).s
is discarded (due to LIMIT 1 on table t
), and it will always trigger an ON DUPLICATE KEY
which will UPDATE
the some_value
column.s
).Note: Every table in a relational database should have at least a primary auto-increment id
column. If you don't have this, add it, even when you don't need it at first sight. It is definitely needed for this "trick".