MySQL Conditional Insert

前端 未结 13 1156
予麋鹿
予麋鹿 2020-11-22 09:51

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

相关标签:
13条回答
  • 2020-11-22 10:17

    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
    
    0 讨论(0)
  • 2020-11-22 10:17

    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.

    0 讨论(0)
  • 2020-11-22 10:18

    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;
    
    0 讨论(0)
  • 2020-11-22 10:22

    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).

    0 讨论(0)
  • 2020-11-22 10:23

    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.

    0 讨论(0)
  • 2020-11-22 10:24

    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
    
    0 讨论(0)
提交回复
热议问题