首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用子查询创建单个查询,本质上是一个带有select查询的插入查询

使用子查询创建单个查询,本质上是一个带有select查询的插入查询
EN

Stack Overflow用户
提问于 2019-04-07 23:00:18
回答 2查看 279关注 0票数 2

我已经用flask创建了一个登录函数,它由打开数据库连接的代码组成,然后根据输入的用户名选择用户名。更准确地说,查询如下:

代码语言:javascript
运行
复制
cursor.execute("""
SELECT username FROM user_tbl 
WHERE username = %s""",
(self.username))

之后,我检查获取的数据的长度,如果长度为0,则打开另一个连接,然后执行插入查询,如下所示:

代码语言:javascript
运行
复制
cursor.execute("""
INSERT INTO 
user_tbl(username,password,email,user_type) 
VALUES(%s,%s,%s,%s)""", 
(self.username,self.password,self.email,self.user_type))

自从使用PHP编码以来,我就一直在做这个过程,我想确认是否有任何方法可以组合这两个查询。我疯狂地研究,似乎找不到答案……或者至少答案是有效的。

MySQL direct INSERT INTO with WHERE clause根据公认的答案,INSERT INTO...SELECT是可行的方法,但是在研究它主要是关于从另一个表到另一个表的数据传输时,我的目标是一个表(如果我遗漏了什么,我很抱歉)。

我找不到链接,但我找到了另一个答案,该答案提到,除了我上面发布的答案之外,只有当您检查是否没有插入时,才会在INSERT查询中看到WHERE子句(这是有意义的,基于这个答案,我得出结论,在插入查询中有一个where子句是可以的)。

在此链接中检查了对WHERE子句和以下示例的子查询后:https://www.essentialsql.com/get-ready-to-learn-sql-server-21-using-subqueries-in-the-where-clause/,我已经创建了自己的查询:

代码语言:javascript
运行
复制
INSERT INTO user_tbl(username,password,email,user_type)
VALUES("test.test","test","test","test")
WHERE username IN 
(SELECT username FROM user_tbl WHERE username="test.test");

我选择IN的原因是,正如链接中提到的,一旦一个子查询返回NULLIN就会为WHERE子句返回false (至少我是这样解释的)。

不幸的是,每次我在我的终端上运行这段代码时,我都会得到这个语法错误:

错误1064 (42000):您的SQL语法中有一个错误;请查看与您的MySQL服务器版本对应的手册,以了解要使用的正确语法,该语法与“WHERE username in (SELECT username FROM user_tbl WHERE username=”test.test“)”相近。

所以才有了这个标题,你们能解释一下我的代码到底是怎么在语法上出错的吗?另外,也许你能给我指出正确的方向,因为我在这方面非常迷茫。

提前谢谢你,

Inno

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-07 23:12:03

我知道您只想在user_tblINSERT一个尚不存在的新记录。

为此,MysQL有一个特殊的语法,称为INSERT ... ON DUPLICATE KEY UPDATE

为此,您需要将列username作为表中的主键(或具有UNIQUE约束)。

然后,您可以简单地执行以下操作:

代码语言:javascript
运行
复制
cursor.execute(
    """
        INSERT INTO user_tbl(username,password,email,user_type) 
        VALUES(%s,%s,%s,%s)
        ON DUPLICATE KEY UPDATE username = VALUES(username)
    """, 
    (self.username,self.password,self.email,self.user_type)
)

如果给定的username不存在任何记录,则会创建一条新记录。否则,调用UPDATE子句(在这里,这将简单地将相同的值重新分配给username,这基本上是一个无操作)。

票数 0
EN

Stack Overflow用户

发布于 2019-04-07 23:06:55

您不能使用相同的表,但您可以“隐藏”SELECT then MySQL看不到这一点:

代码语言:javascript
运行
复制
INSERT INTO user_tbl(username,password,email,user_type)
VALUES("test.test","test","test","test")
WHERE username IN 
(SELECT * FROM ( 
   SELECT username FROM user_tbl WHERE username="test.test" 
   ) as myuser
);  
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55560350

复制
相关文章

相似问题

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