代码之家  ›  专栏  ›  技术社区  ›  The Unknown

MySQL条件插入

  •  110
  • The Unknown  · 技术社区  · 17 年前

    我很难形成有条件的INSERT

    Insert into x_table (instance, user, item) values (919191, 123, 456) 
        ONLY IF there are no rows where user=123 and item=456 
    

    13 回复  |  直到 17 年前
        1
  •  123
  •   Community Mohan Dere    7 年前

    如果您的DBMS在执行插入时没有对从哪个表中选择施加限制,请尝试:

    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)
    

    在此, dual 是一个只有一行的表(最初在Oracle中找到,现在也在mysql中找到)。逻辑是SELECT语句生成具有所需值的单行数据,但仅在尚未找到值时。

        2
  •  54
  •   MrD    14 年前

    您还可以使用 INSERT IGNORE 当您对(user,item)有唯一索引时,它会默默地忽略插入,而不是更新或插入行。

    查询将如下所示:

    INSERT IGNORE INTO x_table(instance, user, item) VALUES (919191, 123, 456)
    

    CREATE UNIQUE INDEX user_item ON x_table (user, item) .

        3
  •  35
  •   temple    14 年前

    你试过这样的东西吗?

    INSERT INTO x_table (instance, user, item)
    SELECT 919191 as instance, 123 as user, 456 as item
    FROM x_table
    WHERE (user=123 and item=456)
    HAVING COUNT(*) = 0;
    
        4
  •  10
  •   Alex Martelli    17 年前

    用一个 UNIQUE(user, item) ,做:

    Insert into x_table (instance, user, item) values (919191, 123, 456) 
      ON DUPLICATE KEY UPDATE user=123
    

    user=123 bit是一个“no op”来匹配语法 ON DUPLICATE 当有重复时,子句实际上什么也不做。

        5
  •  3
  •   Gew    11 年前

    如果你不想设置一个唯一的约束,这就像一个魅力:

    INSERT INTO `table` (`column1`, `column2`) SELECT 'value1', 'value2' FROM `table` WHERE `column1` = 'value1' AND `column2` = 'value2' HAVING COUNT(`column1`) = 0
    

    希望它能有所帮助!

        6
  •  2
  •   martin    11 年前

    你想要的是 INSERT INTO table (...) SELECT ... WHERE ... .从 MySQL 5.6 manual .

    在你的情况下,它是:

    INSERT INTO x_table (instance, user, item) SELECT 919191, 123, 456 
    WHERE (SELECT COUNT(*) FROM x_table WHERE user=123 AND item=456) = 0
    

    INSERT 或者你可以设置一个 UNIQUE 键入这两列的组合,然后使用 INSERT IGNORE .

        7
  •  1
  •   NickZoic    17 年前

    如果你添加了一个唯一的约束(x_table.user,x_table.item),那么插入具有相同用户和项的另一行将失败。

    如:

    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
    
        8
  •  1
  •   Beatles1692    17 年前

    虽然在插入数据之前检查重复是件好事,但我建议你在列上设置一个唯一的约束/索引,这样就不会错误地插入重复数据。

        9
  •  1
  •   Grant Miller    7 年前

    INSERT INTO x_table(instance, user, item) 
        SELECT 919191, 123, 456
            FROM dual
            WHERE 123 NOT IN (SELECT user FROM x_table)
    
        10
  •  0
  •   Danny    15 年前

    对Alex的响应稍作修改,您也可以只引用现有的列值:

    Insert into x_table (instance, user, item) values (919191, 123, 456) 
      ON DUPLICATE KEY UPDATE user=user
    
        11
  •  0
  •   xsubira    13 年前

    所以这个代表PostgreSQL

    INSERT INTO x_table
    SELECT NewRow.*
    FROM (SELECT 919191 as instance, 123 as user, 456 as item) AS NewRow
    LEFT JOIN x_table
    ON x_table.user = NewRow.user AND x_table.item = NewRow.item
    WHERE x_table.instance IS NULL
    
        12
  •  0
  •   jlh    5 年前

    今天我发现a SELECT 声明可以有 WHERE 即使没有条件 FROM 子句,根本不读取任何表。

    这使得使用此构造有条件地插入内容变得非常容易:

    SELECT ... INTO @condition;
    -- or if you prefer: SET @condition = ...
    
    INSERT INTO myTable (col1, col2) SELECT 'Value 1', 'Value 2' WHERE @condition;
    

    在MySQL 5.7和MariaDB 10.3上进行了测试。

        13
  •  -1
  •   Rick J    17 年前
    Insert into x_table (instance, user, item) values (919191, 123, 456) 
        where ((select count(*) from x_table where user=123 and item=456) = 0);
    

    语法可能因数据库而异。..

    推荐文章