2014-10-08 162 views
0

我創建了以下存儲過程:MySQL的存儲過程,檢查是否存在記錄

CREATE DEFINER=`root`@`localhost` PROCEDURE `add_summit`(IN `assoc_code` CHAR(5), IN `assoc_name` CHAR(50), IN `reg_code` CHAR(2), IN `reg_name` CHAR(100), IN `code` CHAR(20), IN `name` CHAR(100), IN `sota_id` CHAR(5), IN `altitude_m` SMALLINT(5), IN `altitude_ft` SMALLINT(5), IN `longitude` DECIMAL(10,4), IN `latitude` DECIMAL(10,4), IN `points` TINYINT(3), IN `bonus_points` TINYINT(3), IN `valid_from` DATE, IN `valid_to` DATE) 
BEGIN 
    declare assoc_id SMALLINT(5); 
    declare region_id SMALLINT(5); 
    declare summit_id MEDIUMINT(8);  

    -- ASSOCIATION check if an association with the given code and name already exists 
    SELECT id INTO assoc_id FROM association WHERE code = assoc_code LIMIT 1; 

    IF (assoc_id IS NULL) THEN 
    INSERT INTO association(code, name) VALUES (assoc_code, assoc_name); 
    set assoc_id = (select last_insert_id()); 
    END IF; 

    -- REGION check if a region with the given code and name already exists 
    SET region_id = (SELECT id FROM region WHERE code = reg_code AND name = reg_name AND association_id = assoc_id); 
    IF (region_id IS NULL) THEN 
    INSERT INTO region(association_id, code, name) VALUES (assoc_id, reg_code, reg_name); 
    set region_id = (select last_insert_id()); 
    END IF; 

    -- SUMMIT check if a summit with given parameters already exists 
    SET summit_id = (SELECT id FROM summit WHERE association_id = assoc_id AND region_id = region_id); 
    IF (summit_id IS NULL) THEN 
    INSERT INTO summit(code, name, sota_id, association_id, region_id, altitude_m, altitude_ft, longitude, 
    latitude, points, bonus_points, valid_from, valid_to) 
     VALUES (code, name, sota_id, assoc_id, region_id, altitude_m, altitude_ft, longitude, latitude, 
     points, bonus_points, valid_from, valid_to); 
    END IF; 
END$$ 

基本上,它應該和檢查,如果在一些表中存在的記錄,如果沒有,就應該將其插入和使用插入的id(自動增量)。 問題是,即使記錄存在(例如在關聯表中),assoc_id也會一直返回null,並導致記錄重複。 我是新來的存儲過程,所以我可能會做一些愚蠢的錯誤。我一直試圖調試這個SP幾個小時,但我找不到問題。

+0

您可能會遇到'empty!= NULL'問題。看看[這](http://stackoverflow.com/questions/17832906/how-to-check-if-field-is-null-or-empty-mysql)的答案。也許有一些嘗試... – ethrbunny 2014-10-08 16:32:03

回答

0

一個新手的錯誤。 我忘了在字段比較中指定表名,並導致與參數名稱(例如參數名稱)的一些衝突。 一個好主意是爲參數指定某種類型的前綴(如p_),並始終在SP中指定表的名稱。