MySQL Conditional Insert
If your DBMS does not impose limitations on which table you select from when you execute an insert, try:
INSERT INTO x_table(instance, user, item)
SELECT 919191, 123, 456
FROM dual
WHERE NOT EXISTS (SELECT * FROM x_table
WHERE user = 123
AND item = 456)
In this, dual
is a table with one row only (found originally in Oracle, now in mysql too). The logic is that the SELECT statement generates a single row of data with the required values, but only when the values are not already found.
Alternatively, look at the MERGE statement.
You can also use INSERT IGNORE
which silently ignores the insert instead of updating or inserting a row when you have a unique index on (user, item).
The query will look like this:
INSERT IGNORE INTO x_table(instance, user, item) VALUES (919191, 123, 456)
You can add the unique index with CREATE UNIQUE INDEX user_item ON x_table (user, item)
.
Have you ever tried something like that?
INSERT INTO x_table
SELECT 919191 as instance, 123 as user, 456 as item
FROM x_table
WHERE (user=123 and item=456)
HAVING COUNT(*) = 0;
With a UNIQUE(user, item)
, do:
Insert into x_table (instance, user, item) values (919191, 123, 456)
ON DUPLICATE KEY UPDATE user=123
the user=123
bit is a "no-op" to match the syntax of the ON DUPLICATE
clause without actually doing anything when there are duplicates.