MySQL条件插入

The*_*own 94 mysql conditional insert

我很难形成条件INSERT

我有x_table与列(实例,用户,项),其中实例ID是唯一的.我想仅在用户已经没有给定项目时才插入新行.

例如,尝试插入instance = 919191 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 
Run Code Online (Sandbox Code Playgroud)

任何有关正确方向的帮助或指导都将非常感激.

Jon*_*ler 111

如果您的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)
Run Code Online (Sandbox Code Playgroud)

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

或者,查看MERGE语句.

  • 请注意,在MySQL中,您实际上不需要存在一个名为"dual"的表:它是一个特殊的表名,可用于从中选择任何内容. (9认同)
  • 如果你还没有`dual`,你需要创建它.`CREATE TABLE dual(dummy CHAR(1)DEFAULT'x'NOT NULL CHECK(dummy ='x')PRIMARY KEY); 插入双重值('x'); 在双重公共场所撤消所有; GRANT SELECT ON双TO PUBLIC;` (8认同)
  • MySQL"尊重""双重"的概念,但实际上并不存在.例如,如果你`SELECT COUNT(*)FROM dual`你总是得到`1`,如果你`SELECT'foo'FROM"你总是得到`foo`.但你不能`SELECT*FROM dual`而你不能`DESCRIBE dual`或类似的东西.我没有检查过,但我也认为你也不能撤销对`dual`的权限.因此,值得指出的是,它可以按预期工作......除非它没有;) (3认同)

MrD*_*MrD 47

您还可以使用INSERT IGNORE静默忽略插入而不是在(user,item)上有唯一索引时更新或插入行.

查询将如下所示:

INSERT IGNORE INTO x_table(instance, user, item) VALUES (919191, 123, 456)
Run Code Online (Sandbox Code Playgroud)

您可以添加唯一索引CREATE UNIQUE INDEX user_item ON x_table (user, item).

  • 根据MySQL文档,INSERT IGNORE是REPLACE的对应物...... INSERT IGNORE:保留旧行.REPLACE:保留新行.两者都使用独特的键. (2认同)

小智 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;
Run Code Online (Sandbox Code Playgroud)


Ale*_*lli 10

用a UNIQUE(user, item),做:

Insert into x_table (instance, user, item) values (919191, 123, 456) 
  ON DUPLICATE KEY UPDATE user=123
Run Code Online (Sandbox Code Playgroud)

这个user=123位是一个"无操作"来匹配ON DUPLICATE子句的语法而没有实际做任何重复的事情.