簡體   English   中英

MySQL過程檢查記錄是否存在,然后插入不起作用

[英]MySQL Procedure check if record exists before insert not working

我已經看過這里的其他問題。 它不起作用。

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `environment_admin`(
IN environment_id   TEXT,
IN user_id          TEXT,
IN username         VARCHAR(75),
IN password         VARCHAR(512)
)
BEGIN
DECLARE env_id INT;
DECLARE admin_id INT;

SET env_id = CAST(environment_id AS SIGNED INT);
SET admin_id = CAST(user_id AS SIGNED INT);

IF NOT EXISTS(SELECT 1 FROM `environment`.`environment_accounts` WHERE environment_id = env_id AND user_id = admin_id) THEN
    BEGIN
    INSERT INTO 
        `environment`.`environment_accounts` 
        (
            `environment_id`, 
            `user_id`, 
            `username`, 
            `password`, 
            `is_active`, 
            `is_admin`, 
            `is_mod`
        ) 
        VALUES 
        (
            env_id, 
            admin_id,
            username,
            password,
            1,
            1,
            1
        );
    END;
END IF;
END

所以,如果我跑:

CALL `environment`.`environment_admin`('22','1','kacieh','512c9ad228332bbd30d09ce7ffb8896e00a1610e914a5fa180bf15ce702b90423e6a9540579f672315ae3c6cb1b8d06ee2b784b4761e806675aa88c2a915553e');

我得到了0行,而且果然沒有任何反應。 -_-我已經在這幾個小時里工作了,我測試了條件查詢,它可以正常工作。 我只測試了存儲過程中的插入語句,它也可以正常工作。

別那樣做,它效率低下,如果兩個insert同時運行,可能會更糟! :)

使用INSERT...。ON DUPLICATE KEY UPDATE ... 請參閱此處

一種技巧是執行ON DUMPLICATE KEY UPDATE Environment_id = env_id(不更改列,因此不會進行任何更新,確保INSERT在沒有任何錯誤情況下將不起作用,您可以在此之后檢查已修改/插入的行數)

我知道您已經解決了自己的問題(並為Parallelis的答案+1,尤其是突出顯示並發問題),但以防萬一它可以幫助其他人...

MySQL可能會混淆您的參數environment_iduser_idenvironment_accountsenvironment_iduser_id之間的混淆。 我懷疑參數在WHERE子句中處於優先地位,這意味着只要environment_accounts中至少有一行,則NOT EXISTS子句將始終返回false,並且您的插入將永遠不會運行。

例如,如果您的environment_iduser_id參數的值分別為1和2,則NOT EXISTS子句的計算結果為

IF NOT EXISTS(SELECT 1 FROM `environment`.`environment_accounts` WHERE 1 = 1 AND 2 = 2) THEN

可能需要為您的參數(和其他變量)命名約定,例如為參數添加諸如p_類的前綴。

暫無
暫無

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

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