I am having a difficult time forming a conditional INSERT
I have x_table with columns (instance, user, item) where instance ID is unique. I want to insert a new row
Slight modification to Alex's response, you could also just reference the existing column value:
Insert into x_table (instance, user, item) values (919191, 123, 456)
ON DUPLICATE KEY UPDATE user=user
I have found out today that a SELECT
statement can have a WHERE
condition even if it has no FROM
clause and does not read any tables at all.
This makes it very easy to conditionally insert something using this construct:
SELECT ... INTO @condition;
-- or if you prefer: SET @condition = ...
INSERT INTO myTable (col1, col2) SELECT 'Value 1', 'Value 2' WHERE @condition;
Tested this on MySQL 5.7 and MariaDB 10.3.
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;
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)
.
Although it's good to check for duplication before inserting your data I suggest that you put a unique constraint/index on your columns so that no duplicate data can be inserted by mistake.
If you add a constraint that (x_table.user, x_table.item) is unique, then inserting another row with the same user and item will fail.
eg:
mysql> create table x_table ( instance integer primary key auto_increment, user integer, item integer, unique (user, item));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into x_table (user, item) values (1,2),(3,4);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> insert into x_table (user, item) values (1,6);
Query OK, 1 row affected (0.00 sec)
mysql> insert into x_table (user, item) values (1,2);
ERROR 1062 (23000): Duplicate entry '1-2' for key 2