我正在尝试向表中插入一行,但前提是表中不存在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;任何帮助都是非常感谢的。
发布于 2013-07-21 13:05:49
一种可能的解决方案是在(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);这是演示
发布于 2013-07-21 11:40:17
本质上,您所要做的就是用select * from()包装您的select。这将使您的查询:
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的上面的链接中有更多关于这类东西的信息。
https://stackoverflow.com/questions/17768702
复制相似问题