2013-04-26 26 views
0

我正在調用存儲過程以使用PHP頁面向數據庫中插入少量詳細信息。只有在表中沒有類似的數據輸入的情況下,才應該輸入數據。我試圖通過一起提出100個請求來測試它(使用測試工具)。但執行後有4倍同一行。防止存儲過程中的表中存在多個條目的問題

這裏是存儲過程我使用:

DELIMITER $$ 

USE `mydb`$$ 

DROP PROCEDURE IF EXISTS `AddCreditCard`$$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `AddCreditCard`(IN scardname VARCHAR(200),scardnumber VARCHAR(200),scardedate VARCHAR(200),scardcvv VARCHAR(200),scountry VARCHAR(200),sdeviceid TEXT,scard_type VARCHAR(200),OUT rflag INT) 
BEGIN 
    DECLARE user_id INT DEFAULT -1; 
    DECLARE card_count INT DEFAULT -1; 
    START TRANSACTION; 
    SET rflag=0; 
    SELECT udd_user_id_fk INTO user_id FROM user_device_details WHERE udd_device_id=sdeviceid; 
    IF user_id<>0 THEN 
     SELECT COUNT(uccd_entry_id) INTO card_count FROM user_credit_card_details WHERE uccd_card_number=scardnumber AND uccd_user_id_fk=user_id; 
     IF card_count=0 THEN 

      INSERT INTO user_credit_card_details(uccd_user_id_fk,uccd_card_name,uccd_card_number,uccd_card_expiry_date,uccd_card_cvv,uccd_country,uccd_card_type)VALUES(user_id,scardname,scardnumber,scardedate,scardcvv,scountry,scard_type); 
      SET rflag=1; 
     ELSE 
      SET rflag=414; 
     END IF; 
    ELSE 
     SET rflag=0; 
    END IF; 
    COMMIT; 
END$$ 

DELIMITER ; 

我期待的結果是,首先它應該返回「1」,並且,對於它應該返回「414」之後的所有請求。請向我建議這個問題的解決方案。

+0

使用存儲過程來實現這一點絕對有必要嗎?在我看來,這可以使用(uccd_card_number,uccd_user_id)和外鍵約束上的唯一索引輕鬆解決,以確保用戶行存在。 – Pudge601 2013-04-26 13:36:16

回答

0

如果在IF之後和THEN之前有多行,則需要將它們包含在BEGIN...END塊中。