首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不执行SELECT语句的MySQL INSERT

不执行SELECT语句的MySQL INSERT
EN

Stack Overflow用户
提问于 2013-07-21 11:13:42
回答 2查看 166关注 0票数 0

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

代码语言:javascript
复制
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;

任何帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-21 13:05:49

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

代码语言:javascript
复制
ALTER TABLE tiles ADD UNIQUE (x, y);

并使用INSERT IGNORE

代码语言:javascript
复制
INSERT IGNORE INTO tiles VALUES (UUID(), (FLOOR(RAND() * 4)), 0, 0);
INSERT IGNORE INTO tiles VALUES (UUID(), (FLOOR(RAND() * 4)), 0, 0);

这是演示

票数 1
EN

Stack Overflow用户

发布于 2013-07-21 11:40:17

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

代码语言:javascript
复制
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的上面的链接中有更多关于这类东西的信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17768702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档