0

我正在尝试在 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 ;

两者都没有给我预期的结果。对于如何解决这个问题,有任何的建议吗?

4

3 回答 3

3

您的第一次尝试非常好,除了您使用*分隔符并为您的参数和列名使用相同的名称。这让 MySQL 感到困惑。像这样写:

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 ;
于 2013-08-22T08:46:03.930 回答
0
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');   

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

于 2013-08-22T07:45:24.077 回答
0
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 ;
于 2013-08-22T07:53:09.290 回答