【问题标题】:Creating single query with subquery, essentially a insert query with select query使用子查询创建单个查询,本质上是使用选择查询的插入查询
【发布时间】:2019-04-07 15:00:18
【问题描述】:

我用烧瓶创建了一个登录功能,它包含一个打开与数据库的连接的代码,然后根据输入的用户名选择一个用户名。更准确地说,查询如下:

cursor.execute("""
SELECT username FROM user_tbl 
WHERE username = %s""",
(self.username))

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

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 子句(除了我上面发布的答案)是当你'重新检查是否没有'EXISTS'(这是有道理的,基于该答案,我得出结论,在插入查询中使用 where 子句是可以的)。

在检查了WHERE 子句的子查询并遵循此链接中的示例之后:https://www.essentialsql.com/get-ready-to-learn-sql-server-21-using-subqueries-in-the-where-clause/ 我创建了自己的查询:

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 的原因是,如链接中所述,一旦子查询返回 NULL,IN 就会为 WHERE 子句返回 false(至少我是这样解释的)。

不幸的是,每次我在终端上运行此代码时都会出现以下语法错误:

ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在 'WHERE username IN (SELECT username FROM user_tbl WHERE username="test.test")' 附近使用的正确语法

因此标题,你们能解释一下我的代码在语法上到底有什么错误吗?另外,您能否指出我正确的方向,因为我对此非常迷茫。

提前致谢,

创新

【问题讨论】:

    标签: python mysql sql flask refactoring


    【解决方案1】:

    我了解您希望 INSERT 在 user_tbl 中创建新记录,前提是它尚不存在。

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

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

    那么你可以简单地做:

    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 ,这基本上是一个无操作)。

    【讨论】:

    • 唯一性约束是否必要?我正计划确保用户名保持唯一,但是如果需要,我将更改列
    • 是的,username 应该是表的主键,或者具有UNIQUE 约束。一种或另一种方式,这表明 MySQL 给定的列应该是唯一的,并允许它实现 ON DUPLICATE KEY 功能。
    • 再次嗨,查询是否有可能在重复键上返回 false?
    【解决方案2】:

    你不能使用同一张表,但你可以“隐藏”SELECT然后MySQL没有看到这样的:

    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
    );  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-26
      • 2014-09-01
      • 2011-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-17
      • 1970-01-01
      相关资源
      最近更新 更多