簡體   English   中英

使用子查詢創建單個查詢,本質上是使用選擇查詢創建插入查詢

[英]Creating single query with subquery, essentially a insert query with select query

我用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根據那里接受的答案直接使用WHERE子句直接進行INSERT INTOINSERT INTO...SELECT是必經之路,但是在考察了它的主要內容是將數據從另一個表轉移到另一個表之后,我的目標是一個表(我道歉如果我缺少什么)。

我找不到鏈接,但是我找到了另一個答案,該答案提到只有在您檢查是否沒有'EXISTS'時,您才能在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的原因是,如鏈接中所述,因為一旦子查詢返回NULLINWHERE子句返回false(至少這就是我的解釋方式)。

不幸的是,每次我在終端上運行此代碼時,都會收到以下語法錯誤:

錯誤1064(42000):您的SQL語法有錯誤; 檢查與您的MySQL服務器版本相對應的手冊,以在“ WHERE用戶名輸入(從user_tbl中選擇用戶名,WHERE用戶名=“ test.test”)附近”附近使用正確的語法

因此,標題為“你們能解釋我的代碼在語法上有多錯誤嗎?”。 另外,您能確定我的方向正確嗎,因為我對此非常迷失。

提前致謝,

英諾

您不能使用同一張表,但可以“隱藏” 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
);  

我了解您僅在尚不存在的情況下才想在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 ,基本上是no-op)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM