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

标签 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 语句也不起作用。这是我的第一个存储过程,我正在学习。我正在尝试但无法理解失败的原因。

最佳答案

你想要:

SELECT COUNT(id) INTO _userCount FROM ...

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

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

P.S.:这与您的问题无关,但我注意到您使用的是 INT(36)。 INT 的参数不做任何事情。它不会使 INT 变大或无法接受 36 位数字。请参阅我对 Types in MySQL: BigInt(20) vs Int(20) 的回答

关于mysql - INSERT 查询未在 MySQL 存储过程中运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47582524/

相关文章:

php - 使用不带存储过程的 MySQL 是否会错过某些内容?

具有引用列的 MySQL JOIN 表

Java 硬编码 SQL 查询有效,但从文件缓冲区读取的完全相同的查询失败

mysql - 如何使用mysql中的程序导出表数据

sql-server-2005 - SQL 存储过程使用 SELECT 设置变量

tsql - 在sql存储过程中传递表名

sql-server - TSQL - 在动态表中使用 Case 语句(行数未知)

mysql - 删除重复的记录,除了一个连接三张表

php - 在 mysql 中搜索长字符串中的关键字?

php - php 中的数据库排序和分组