MySql函数没有返回正确的结果

MySql函数没有返回正确的结果,mysql,sql,function,Mysql,Sql,Function,我试图在mysql中创建一个函数,如果表中已经存在id,它将返回布尔值。我在网上找到的大多数解决方案都需要同时使用php和mysql的解决方案,但我正在尝试的是以函数形式使用mysql的解决方案 我的简化mysql表如下所示: CREATE TABLE IF NOT EXISTS table1 ( `user_id` VARCHAR(12) UNIQUE, `name` VARCHAR(128), PRIMARY KEY (`user_id`) ); 我的第一次尝试如下

我试图在mysql中创建一个函数,如果表中已经存在id,它将返回布尔值。我在网上找到的大多数解决方案都需要同时使用php和mysql的解决方案,但我正在尝试的是以函数形式使用mysql的解决方案

我的简化mysql表如下所示:

CREATE TABLE IF NOT EXISTS table1 (
    `user_id` VARCHAR(12) UNIQUE,
    `name` VARCHAR(128),
    PRIMARY KEY (`user_id`)
);
我的第一次尝试如下:

DELIMITER *
DROP FUNCTION IF EXISTS CheckExistId*
CREATE FUNCTION CheckExistId (user_id VARCHAR(12)) RETURNS BOOL
BEGIN
    DECLARE isExist BOOL;
    SET isExist = 0;
    SELECT EXISTS(SELECT * FROM table1 WHERE `user_id`=user_id) INTO isExist ;
    RETURN isExist;
END*
DELIMITER ;
我的第二次尝试:

DELIMITER *
DROP FUNCTION IF EXISTS CheckExistId*
CREATE FUNCTION CheckExistId (user_id VARCHAR(12)) RETURNS BOOL
BEGIN
    DECLARE isExist BOOL;
    DECLARE countRow INT;
    SELECT COUNT(`user_id`) INTO countRow FROM table1 WHERE `user_id`=user_id;
    IF countRow = 0 THEN SET isExist = 1; 
    ELSE SET isExist = 0; 
    END IF;
    RETURN isExist;
END*
DELIMITER ;
两者都没有给我预期的结果。关于如何修复此问题有何建议?

如果存在“Tablet2”,请删除表格;
DROP TABLE IF EXISTS `TableTT2`;
CREATE TABLE IF NOT EXISTS TableTT2 (
    `user_id` VARCHAR(12) UNIQUE,
    `name` VARCHAR(128),
    PRIMARY KEY (`user_id`)
);

INSERT INTO `TableTT2` (`user_id`, `name`) VALUES
(LEFT(UUID(), 12), 'a1'), 
(LEFT(UUID(), 12), 'a2'), 
(LEFT(UUID(), 12), 'a3'), 
(LEFT(UUID(), 12), 'a4'), 
(LEFT(UUID(), 12), 'a5'), 
(LEFT(UUID(), 12), 'a6'), 
(LEFT(UUID(), 12), 'a7'), 
(LEFT(UUID(), 12), 'a8');


    DELIMITER $$

    CREATE FUNCTION `CheckExistId`(usrId varchar(12)) RETURNS BOOL
BEGIN

    DECLARE totalCnt INT;
    DECLARE resBool BOOL;
    SET totalCnt = 0 ;

    SELECT COUNT(*) INTO totalCnt FROM TableTT2 WHERE user_id = usrID; 
    SET resBool = IF(totalCnt <> 0, TRUE, FALSE);
    RETURN resBool;

END


SELECT * FROM TableTT2;
SELECT CheckExistId('fe3faa00-0b0');
SELECT CheckExistId('fe3faa00-111');   
如果不存在,则创建表Tablet2( `用户_id`VARCHAR(12)唯一, `名称`瓦查尔(128), 主键(`user\u id`) ); 在“TableTT2”(`user\u id`、`name`)值中插入 (左(UUID(),12),‘a1’, (左(UUID(),12),‘a2’, (左(UUID(),12),‘a3’, (左(UUID(),12),‘a4’, (左(UUID(),12),‘a5’, (左(UUID(),12),‘a6’, (左(UUID(),12),‘a7’, (左(UUID(),12),“a8”); 分隔符$$ 创建函数“CheckExistId”(usrId varchar(12))返回BOOL 开始 声明totalCnt INT; 宣布resBool BOOL; 设置totalCnt=0; 从表TT2中选择COUNT(*),其中user_id=usrID; 设置resBool=IF(totalCnt 0,TRUE,FALSE); 返回resBool; 结束 从表2中选择*; 选择CheckExistId('fe3faa00-0b0'); 选择CheckExistId('fe3faa00-111');
希望这有帮助。这可能是使用*分隔符的问题,第二个问题是我注意到您的函数参数是varchar,即使您使用整数id进行检查。

如果存在“TableTT2”,则删除TABLE;
DELIMITER *
DROP FUNCTION IF EXISTS CheckExistId*
CREATE FUNCTION CheckExistId (user_id VARCHAR(12)) RETURNS BOOL
BEGIN
SELECT 
    CASE 
        WHEN EXISTS(
             SELECT * FROM table1 WHERE `user_id`=user_id)
        THEN RETURN 1 

        ELSE RETURN 0 
    END
END*
DELIMITER ;
如果不存在,则创建表Tablet2( `用户_id`VARCHAR(12)唯一, `名称`瓦查尔(128), 主键(`user\u id`) ); 在“TableTT2”(`user\u id`、`name`)值中插入 (左(UUID(),12),‘a1’, (左(UUID(),12),‘a2’, (左(UUID(),12),‘a3’, (左(UUID(),12),‘a4’, (左(UUID(),12),‘a5’, (左(UUID(),12),‘a6’, (左(UUID(),12),‘a7’, (左(UUID(),12),“a8”); 分隔符$$ 创建函数“CheckExistId”(usrId varchar(12))返回BOOL 开始 声明totalCnt INT; 宣布resBool BOOL; 设置totalCnt=0; 从表TT2中选择COUNT(*),其中user_id=usrID; 设置resBool=IF(totalCnt 0,TRUE,FALSE); 返回resBool; 结束 从表2中选择*; 选择CheckExistId('fe3faa00-0b0'); 选择CheckExistId('fe3faa00-111');

希望这有帮助。这可能是使用*分隔符的问题,第二个问题是,我注意到您的函数参数是varchar,即使您使用整数id进行检查。

您的第一次尝试很好,只是您使用了
*
作为分隔符,并且对参数和列名使用了相同的名称。这太令人困惑了。这样写:

DELIMITER *
DROP FUNCTION IF EXISTS CheckExistId*
CREATE FUNCTION CheckExistId (user_id VARCHAR(12)) RETURNS BOOL
BEGIN
SELECT 
    CASE 
        WHEN EXISTS(
             SELECT * FROM table1 WHERE `user_id`=user_id)
        THEN RETURN 1 

        ELSE RETURN 0 
    END
END*
DELIMITER ;
DELIMITER $$
DROP FUNCTION IF EXISTS CheckExistId $$
CREATE FUNCTION CheckExistId (p_user_id VARCHAR(12)) RETURNS BOOL
BEGIN
    DECLARE isExist BOOL;
    SET isExist = 0;
    SELECT EXISTS(SELECT * FROM table1 WHERE `user_id`=p_user_id) INTO isExist ;
    RETURN isExist;
END $$
DELIMITER ;

您的第一次尝试很好,只是使用了
*
作为分隔符,并使用相同的名称作为参数和列名。这太令人困惑了。这样写:

DELIMITER $$
DROP FUNCTION IF EXISTS CheckExistId $$
CREATE FUNCTION CheckExistId (p_user_id VARCHAR(12)) RETURNS BOOL
BEGIN
    DECLARE isExist BOOL;
    SET isExist = 0;
    SELECT EXISTS(SELECT * FROM table1 WHERE `user_id`=p_user_id) INTO isExist ;
    RETURN isExist;
END $$
DELIMITER ;


在#1中,您使用星号作为分隔符,但在select语句中使用星号(星号),这可能是一个问题吗?不确定-只是猜测。这是学校作业吗?@kimsia nope。为office构建一个简单的php/mysql系统。@Freudian是的,也许。。现在请检查。@ImpStudent在这种情况下,您能帮助我理解为什么纯粹在mysql中需要这样做吗?在#1中,您使用星号作为分隔符,但在select语句中却有星号(星号)可能是个问题吗?不确定-只是猜测。这是学校作业吗?@kimsia nope。为office构建一个简单的php/mysql系统。@Freudian是的,也许。。现在请检查。@ImpStudent在这种情况下,您能帮助我理解为什么需要在mysql中执行此操作吗?我试图理解您的代码。。为什么有两个返回语句?顺便说一句,我已经纠正了id应该在varchar(12)中,而不是像我前面提到的int。我的错误是return语句的拼写错误,应该适用于vrachar我更新了代码我试图理解你的代码。。为什么有两个返回语句?顺便说一句,我已经纠正了id应该是varchar(12)而不是我前面提到的int。我的错误是return语句的拼写错误,应该适用于vrachar。我更新了代码,似乎它不适用于我。首先是分隔符的错误。我将它改为//并再次测试。现在它抛出了一个语法错误,在“then return 1”处出现意外的return\u sym。似乎它对我不起作用。首先是分隔符的错误。我将它改为//并再次测试。现在它抛出了一个语法错误,在“then return 1”处出现意外的return\u sym。这对我来说很有用!我不知道参数和列名不能使用相同的名称。。谢谢参数和列名相同。如果countRow=0,那么设置isExist=0,不应该是
;否则,设置isExist=1?如果countRow=0,则返回0;否则返回1这对我有用!我不知道参数和列名不能使用相同的名称。。谢谢参数和列名相同。如果countRow=0,那么设置isExist=0,不应该是
;否则,设置isExist=1?如果countRow=0,则返回0;否则返回1