2

我已经查看了有关此问题的其他问题。它不工作。

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 行影响,果然,什么也没发生。-_- 这几个小时我一直在工作,我测试了条件查询,它有效。我只测试了存储过程中的插入语句,它也可以工作。

4

2 回答 2

5

不要那样做,效率低下,如果两个插入同时运行可能会更糟!:)

使用 INSERT.... ON DUPLICATE KEY UPDATE ...见这里

一个技巧是执行 ON DUPLICATE KEY UPDATE environment_id = env_id (不更改列,因此不会更新任何内容,确保 INSERT 不会在没有任何错误条件的情况下工作,之后您可以检查修改/插入的行数)

于 2012-08-30T04:42:41.507 回答
2

我意识到您已经解决了您的问题(并为 Parallelis 的回答 +1,特别是在突出并发问题时),但以防万一它可以帮助其他人......

environment_idMySQL 可能在您的参数anduser_idenvironment_accountsenvironment_idand之间感到困惑user_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_为参数添加前缀。

于 2012-09-03T15:28:37.090 回答