MySQL的条件插入

问题描述 投票:87回答:12

我有困难的时候形成一个条件INSERT

我有x_table与在实例ID是唯一的列(例如,用户,项目)。我想插入新行仅当用户已经没有一个给定的项目。

例如试图插入实例= 919191用户= 123项= 456

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

在正确的方向上没有任何帮助或指导将不胜感激。

mysql insert conditional
12个回答
108
投票

如果你的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是只有一行的表(在MySQL在甲骨文最初发现,现在也是如此)。该逻辑是SELECT语句生成与所需值的数据单排,但只有当尚未找到的值。

另外,看MERGE语句。


0
投票

所以这一个站对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

0
投票

您可以采用如下方案来解决问题:

INSERT INTO x_table(instance, user, item) 
    SELECT 919191, 123, 456
        FROM dual
        WHERE 123 NOT IN (SELECT user FROM x_table)

-1
投票
Insert into x_table (instance, user, item) values (919191, 123, 456) 
    where ((select count(*) from x_table where user=123 and item=456) = 0);

语法可能会因您的数据库而异...


47
投票

您还可以使用INSERT IGNORE其自动忽略,而不是更新或插入一行,当你有上(用户,项目)唯一索引插入。

该查询将如下所示:

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

你可以用CREATE UNIQUE INDEX user_item ON x_table (user, item)添加唯一索引。


26
投票

你有没有试过这样的事情?

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;

10
投票

随着UNIQUE(user, item),这样做:

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

user=123位是“不操作”,以配合ON DUPLICATE从句的语法,而无需实际做任何事情时有重复。


2
投票

如果你不希望设置一个唯一约束,这个工程就像一个魅力:

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

希望能帮助到你 !


1
投票

如果添加约束(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

1
投票

虽然这是很好的检查重复插入数据之前,我建议你把你列的唯一约束/索引,以便没有重复的数据可以被错误地插入。


1
投票

你需要的是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

或许因为你没有使用任何复杂的逻辑来determiante是否运行INSERT与否,你可以只设置在这两列的组合UNIQUE键,然后使用INSERT IGNORE


0
投票

轻微修改Alex的响应,你也可以只引用现有的列值:

Insert into x_table (instance, user, item) values (919191, 123, 456) 
  ON DUPLICATE KEY UPDATE user=user
© www.soinside.com 2019 - 2024. All rights reserved.