2014-09-11 70 views
0

以我user表的ID user_id随机由以下函数生成内部存在的行:检查是否一个MySQL函数

DELIMITER # 
CREATE FUNCTION GenerateRandomUserID() 
    RETURNS CHAR(15) 
    BEGIN 
     DECLARE user_id CHAR(15) DEFAULT ''; 

     WHILE LENGTH(user_id) < 15 DO 
      SET user_id = CONCAT(user_id, SUBSTRING('', RAND() * 10 + 1, 1)); 
     END WHILE; 

     RETURN user_id; 
    END# 
DELIMITER ; 

DELIMITER # 
CREATE FUNCTION GenerateUniqueUserID() 
    RETURNS CHAR(15) 
    BEGIN 
     DECLARE user_id CHAR(15) DEFAULT ''; 

     REPEAT 
      SET user_id = GenerateRandomUserID(); 
     UNTIL NOT UserIDExists(user_id) END REPEAT; 

     RETURN user_id; 
    END# 
DELIMITER ; 

我然后插入一个用户生成其ID与此功能。到现在为止还挺好。问题是当我插入另一个用户时,会产生无限循环。我设法将问题归结为另一个函数UserIDExists,它总是返回TRUE(它不应该,显然)。

DELIMITER # 
CREATE FUNCTION UserIDExists(user_id CHAR(15)) 
    RETURNS BOOL 
    BEGIN 
     RETURN EXISTS(SELECT 1 FROM `user` WHERE `user_id` = user_id); 
    END# 
DELIMITER ; 

这最后一个函数并没有做它应该的,但我找不出原因。如果单个用户存在任意密码,则仅在没有用户返回FALSE时返回TRUE。任何人都可以找出原因吗?

更新:

我也试过这个。同样的结果:

DELIMITER # 
CREATE PROCEDURE UserIDExists(IN user_id CHAR(15), OUT user_id_exists BOOL) 
    BEGIN 
     SET user_id_exists = 0; 
     SELECT 1 INTO user_id_exists FROM `user` WHERE `user_id` = user_id; 
    END# 
DELIMITER ; 

更新:

尝试这样还有:

DELIMITER # 
CREATE PROCEDURE UserIDExists(IN user_id CHAR(15), OUT user_id_exists BOOL) 
    BEGIN 
     IF ((SELECT `user_id` FROM `user` WHERE `user_id` = user_id) != NULL) THEN 
      SET user_id_exists = TRUE; 
     ELSE 
      SET user_id_exists = FALSE; 
     END IF; 
    END# 
DELIMITER ; 

更新:

我试着用下面的几个variantes:

DELIMITER # 
CREATE PROCEDURE UserIDExists_2(IN user_id CHAR(15), OUT user_id_exists CHAR) 
    BEGIN 
     SELECT `user_id` FROM `user` WHERE `user_id` = user_id; 
    END# 
DELIMITER ; 

和凸轮e得出这样的结论:当user_id也是1时,返回1,并返回的任何其他值。这是非常奇怪的,因为这是唯一的行我有表:

# user_id, first_name, last_name, pwd, is_confirmed 
'252316605573186', 'André', 'Fratelli', NULL, '0' 

这让我的神经......

回答

0

这工作。我虽然认为引用足以区分程序的参数和表格的列,但我想我错了。

DELIMITER # 
CREATE PROCEDURE UserIDExists(IN p_user_id CHAR(15), OUT p_user_id_exists BOOL) 
    BEGIN 
     SET p_user_id_exists = EXISTS(SELECT `user_id` FROM `user` WHERE `user_id` = p_user_id); 
    END# 
DELIMITER ; 
相关问题