2013-08-22 46 views
0

我想在mysql中創建一個函數,如果表中已經存在id,將返回布爾值。我在網上找到的大多數解決方案都需要同時使用php和mysql的解決方案,但我想要做的是純粹以mysql的形式使用函數的解決方案。MySql函數不返回正確的結果

我simplifed 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 ; 

兩人都沒有給我我預期的結果。對於如何解決這個問題,有任何的建議嗎?

+1

它可能是一個問題,在#1中使用星號作爲分隔符,但在你的選擇語句中有一個星號(星號)?不確定 - 只是猜測。 – FreudianSlip

+0

這是一個學校作業嗎? –

+0

@ kimsia nope。爲辦公室建立一個簡單的php/mysql系統。 – ImpStudent

回答

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 ; 
+0

這對我有用!我不知道我們不能使用同名的參數和列名。謝謝! – ImpStudent

+0

任何想法爲什麼第二個選項不工作? – ImpStudent

+0

與參數和列名稱相同的故事。不應該是'IF countRow = 0 THEN SET isExist = 0; ELSE SET isExist = 1;'?或更短'IF countRow = 0 THEN RETURN 0; ELSE RETURN 1;' – fancyPants

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。

+0

我想了解你的代碼..爲什麼有兩個RETURN語句?順便說一句,我已經糾正已經認爲該id應該是在varchar(12),而不是像我前面提到的int。 – ImpStudent

+0

我的糟糕的返回聲明的錯字,應該爲vrachar工作我更新了代碼 –

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 ; 
+0

似乎它不適合我。首先是分隔符錯誤。我將它改爲//並再次測試。它現在拋出一個語法錯誤,意外return_sym在「然後返回1」。 – ImpStudent

+0

我也認爲我們需要「最終案例」對? – ImpStudent