INSERT查询未在MySQL存储过程中运行

时间:2017-11-30 20:59:48

标签: mysql stored-procedures

DELIMITER $$
DROP PROCEDURE IF EXISTS `user_db`.`insertUser` $$
CREATE PROCEDURE `user_db`.`insertUser`(
    IN _userEmail VARCHAR(50),
    IN _userPassword VARCHAR(50),
    IN _userPhone VARCHAR(10),
    IN _userUsername VARCHAR(50),
    IN _userAccountType ENUM('0', '1'),
    IN _userAdmin ENUM('0', '1'),
    IN _userSuperAdmin ENUM('0', '1'),
    IN _userPresenceState ENUM('0', '1'),
    OUT _userInsertResult INT(36)
)
NOT DETERMINISTIC MODIFIES SQL DATA SQL SECURITY DEFINER
BEGIN
    DECLARE _userCount INT;

    SELECT COUNT(id) AS _userCount FROM `user_db`.`user_primary` WHERE email = _userEmail LIMIT 1;

    IF _userCount = 0 THEN

    INSERT INTO `user_db`.`user_primary` (id, email, encrypted_password, phone, username, user_account_type, user_admin, user_super_admin, presence_state) VALUES (UUID(), _userEmail, _userPassword, _userPhone, _userUsername, _userAccountType, _userAdmin, _userSuperAdmin, _userPresenceState);
    SET _userInsertResult := LAST_INSERT_ID();

    END IF;
END
$$
DELIMITER ;

我在MYSQL中编写了这个存储过程,以检查用户是否存在,如果计数为0,则插入并返回id否则我将做其他事情。但即使_userCount0INSERT语句也无效。这是我的第一个存储过程,我正在学习。我正在努力但却无法理解失败的原因。

2 个答案:

答案 0 :(得分:3)

你想:

SELECT COUNT(id) INTO _userCount FROM ...

仅使用AS只声明COUNT(id)表达式的列别名,它不会将结果分配给与别名同名的变量。

因此,在您的过程中,变量_userCount永远不会赋值,因此IF块中的语句永远不会运行。

P.S。:这与你的问题无关,但我注意到你正在使用INT(36)。 INT的论点没有做任何事情。它不会使INT更大或能够接受36位数字。请参阅我对Types in MySQL: BigInt(20) vs Int(20)

的回答

答案 1 :(得分:0)

另一个答案是稍微调整一下你的逻辑,取而代之的是

SELECT COUNT(id) AS _userCount 
FROM `user_db`.`user_primary` 
WHERE email = _userEmail LIMIT 1;

IF _userCount = 0 THEN

IF NOT EXISTS (SELECT * FROM `user_db`.`user_primary` WHERE email = _userEmail) THEN
相关问题