我有困难的时候形成一个条件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
在正确的方向上没有任何帮助或指导将不胜感激。
如果你的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语句。
所以这一个站对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
您可以采用如下方案来解决问题:
INSERT INTO x_table(instance, user, item)
SELECT 919191, 123, 456
FROM dual
WHERE 123 NOT IN (SELECT user FROM x_table)
Insert into x_table (instance, user, item) values (919191, 123, 456)
where ((select count(*) from x_table where user=123 and item=456) = 0);
语法可能会因您的数据库而异...
您还可以使用INSERT IGNORE
其自动忽略,而不是更新或插入一行,当你有上(用户,项目)唯一索引插入。
该查询将如下所示:
INSERT IGNORE INTO x_table(instance, user, item) VALUES (919191, 123, 456)
你可以用CREATE UNIQUE INDEX user_item ON x_table (user, item)
添加唯一索引。
你有没有试过这样的事情?
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;
随着UNIQUE(user, item)
,这样做:
Insert into x_table (instance, user, item) values (919191, 123, 456)
ON DUPLICATE KEY UPDATE user=123
该user=123
位是“不操作”,以配合ON DUPLICATE
从句的语法,而无需实际做任何事情时有重复。
如果你不希望设置一个唯一约束,这个工程就像一个魅力:
INSERT INTO `table` (`column1`, `column2`) SELECT 'value1', 'value2' FROM `table` WHERE `column1` = 'value1' AND `column2` = 'value2' HAVING COUNT(`column1`) = 0
希望能帮助到你 !
如果添加约束(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
虽然这是很好的检查重复插入数据之前,我建议你把你列的唯一约束/索引,以便没有重复的数据可以被错误地插入。
你需要的是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
。
轻微修改Alex的响应,你也可以只引用现有的列值:
Insert into x_table (instance, user, item) values (919191, 123, 456)
ON DUPLICATE KEY UPDATE user=user