我已经用flask创建了一个登录函数,它由打开数据库连接的代码组成,然后根据输入的用户名选择用户名。更准确地说,查询如下:
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子句(这是有意义的,基于这个答案,我得出结论,在插入查询中有一个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 (至少我是这样解释的)。
不幸的是,每次我在我的终端上运行这段代码时,我都会得到这个语法错误:
错误1064 (42000):您的SQL语法中有一个错误;请查看与您的MySQL服务器版本对应的手册,以了解要使用的正确语法,该语法与“WHERE username in (SELECT username FROM user_tbl WHERE username=”test.test“)”相近。
所以才有了这个标题,你们能解释一下我的代码到底是怎么在语法上出错的吗?另外,也许你能给我指出正确的方向,因为我在这方面非常迷茫。
提前谢谢你,
Inno
发布于 2019-04-07 23:12:03
我知道您只想在user_tbl中INSERT一个尚不存在的新记录。
为此,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,这基本上是一个无操作)。
发布于 2019-04-07 23:06:55
您不能使用相同的表,但您可以“隐藏”SELECT then 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
); https://stackoverflow.com/questions/55560350
复制相似问题