【问题标题】:MySQL INSERT With SELECT Statement Doing NothingMySQL INSERT 与 SELECT 语句什么都不做
【发布时间】:2013-07-20 01:46:28
【问题描述】:

我试图在表中插入一行,但前提是表中不存在 X 和 Y 的组合,所以我四处搜索并最终提出了这个查询,但它什么也没做,并没有抛出任何错误。

INSERT INTO `tiles` (`TileID`, `Type`, `X`, `Y`) 
 SELECT UUID(), (FLOOR(RAND() * 4)), 0, 0 FROM `tiles` 
 WHERE NOT EXISTS (SELECT 1 FROM `tiles` WHERE `X`=0 AND `Y`=0) LIMIT 1;

非常感谢任何帮助。

【问题讨论】:

标签: mysql select insert where


【解决方案1】:

可能的解决方案是在(x, y) 上添加UNIQUE 约束

ALTER TABLE tiles ADD UNIQUE (x, y);

并使用INSERT IGNORE

INSERT IGNORE INTO tiles VALUES (UUID(), (FLOOR(RAND() * 4)), 0, 0);
INSERT IGNORE INTO tiles VALUES (UUID(), (FLOOR(RAND() * 4)), 0, 0);

这里是SQLFiddle演示

【讨论】:

    【解决方案2】:

    基本上,您所要做的就是用 select * from() 包装您的选择。这使您的查询:

    INSERT INTO `tiles` (`TileID`, `Type`, `X`, `Y`) 
    SELECT * FROM (SELECT UUID(), (FLOOR(RAND() * 4)), 0 as x, 0 as y) as tmp
    WHERE NOT EXISTS (SELECT 1 FROM `tiles` WHERE `X`=0 AND `Y`=0) LIMIT 1;
    

    我不得不添加“as x”和“as y”,因为 mysql 抱怨“重复的列名 '0'”。我的猜测是,如果没有明确写出名称,它只会使用该值作为名称。无论如何,这个查询应该可以工作。此外,在上面 Kyle 的链接中有更多关于这类东西的信息。

    【讨论】:

      猜你喜欢
      • 2014-01-10
      • 2011-12-04
      • 2010-11-18
      • 1970-01-01
      • 2014-06-20
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 2020-02-24
      相关资源
      最近更新 更多