Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL条件插入_Mysql_Insert_Conditional - Fatal编程技术网

MySQL条件插入

MySQL条件插入,mysql,insert,conditional,Mysql,Insert,Conditional,我很难形成有条件的插入 我有一个带有列(实例、用户、项)的x_表,其中实例ID是唯一的。我只想在用户没有给定项的情况下插入新行 例如,尝试插入instance=9191 user=123 item=456 Insert into x_table (instance, user, item) values (919191, 123, 456) ONLY IF there are no rows where user=123 and item=456 如能在正确的方向上提供任何帮助或指

我很难形成有条件的插入

我有一个带有列(实例、用户、项)的x_表,其中实例ID是唯一的。我只想在用户没有给定项的情况下插入新行

例如,尝试插入instance=9191 user=123 item=456

Insert into x_table (instance, user, item) values (919191, 123, 456) 
    ONLY IF there are no rows where user=123 and item=456 
如能在正确的方向上提供任何帮助或指导,我们将不胜感激

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

语法可能因数据库而异…

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

例如:


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

如果您的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语句生成具有所需值的单行数据,但仅当尚未找到值时

或者,查看MERGE语句。

使用
唯一(用户,项目)
,执行以下操作:

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

user=123
位是一个“no op”,用于在存在重复项时匹配
ON DUPLICATE
子句的语法,而不实际执行任何操作。

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

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

你试过那样的东西吗

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;

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

查询将如下所示:

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

您可以使用
在x\u表上创建唯一索引user\u项(user,item)
添加唯一索引,因此此索引代表PostgreSQL


如果您不想设置唯一约束,这就像一个符咒:

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

希望有帮助

您需要的是
插入到表中(…)选择。。。其中…
。从

你的情况是:

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

,您可以使用以下解决方案来解决问题:

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

我今天发现,一个
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上进行了测试。

这是不对的。同一用户可以有多行,但一个用户项对不能有多行。是的,是的。我看错了。编辑以对该对进行约束。很好的注释。。。我使用mysql_query(“INSERT”)在PHP中运行查询,并保留or die部分,因此它不会警告我错误,因此我不必进行任何检查。我无法设置唯一的(用户,项目),因为当多个实例具有相同的用户和项目时,可能会有实例。。。只是在我执行此插入时没有。在这种情况下,是否需要事先创建
dual
,或者它是由查询创建的某种特殊的“临时”表,仅用于查询?如果您还没有
dual
,则需要创建它<代码>创建双表(伪字符(1)默认的“x”非空检查(伪=“x”)主键);插入双值('x');从公众中撤销所有双重身份;向公众授予双重选择权感谢您知道这一点真是太棒了注意,在MySQL中,您真的不需要一个名为“dual”的表来存在:它是一个特殊的表名,可以用来从中选择任何内容。MySQL“尊重”了“dual”的概念,但它实际上并不存在。例如,如果您
从dual
中选择COUNT(*),则始终获得
1
,如果您
从dual
中选择'foo',则始终获得
foo
。但是你不能
从dual
中选择*,也不能
描述dual
或类似的东西。我还没有检查,但我也不认为您可以撤销对
dual
的权限。因此,值得指出的是,它的工作原理与您预期的一样。。。除非它没有;)每个MySQL文档插入忽略是要替换的对应项。。。插入忽略:保留旧行。替换:保留新行。这两种方法都使用唯一的键。最佳答案您运行过答案吗?我不断收到
错误1064(42000):您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以了解在“where…
(运行5.6.34)附近使用的正确语法。我认为您需要说
from dual
,如果没有引用任何表(),则默认为
from dual中的
@hlin117。哦,是的!智能而漂亮的解决方案,只需一个选择语句。这对于postgresql来说在第一次尝试时是有效的,我似乎没有接受的答案。虽然这段代码可能会回答这个问题,但提供关于它如何和/或为什么解决这个问题的附加上下文将提高答案的长期价值。
INSERT INTO x_table(instance, user, item) 
    SELECT 919191, 123, 456
        FROM dual
        WHERE 123 NOT IN (SELECT user FROM x_table)
SELECT ... INTO @condition;
-- or if you prefer: SET @condition = ...

INSERT INTO myTable (col1, col2) SELECT 'Value 1', 'Value 2' WHERE @condition;