2013-05-02 116 views
0

我一直在這一整天,試圖在MYSQL中得到一個簡單的存儲過程,像我想要的那樣工作。 這是存儲過程我使用:MYSQL存儲過程不更新列

delimiter $$ 

CREATE DEFINER=`vhabot`@`%` PROCEDURE `Update_Players`(in uid VARCHAR(64), in cname varchar(45),in rank_name varchar(20), in clevel int, in defrank int, in cfaction varchar(15), in org varchar(100), in today date) 
BEGIN 
DECLARE Records INT; 
DECLARE Updt bool DEFAULT 'TRUE'; 
SET SQL_SAFE_UPDATES=0; 

SELECT COUNT(*) INTO Records FROM dim5players where TRIM(id) = TRIM(uid); 
If Records = 0 THEN 
INSERT INTO dim5players (id, `name`, rank_name, `level`, defender_rank_id, Organization, `Date`, Updated) 
VALUES (uid,cname, rank_name, clevel, defrank, cfaction, org, today, Updt); 
END IF; 

UPDATE dim5players SET Updated=true WHERE `name` = TRIM(cname); 

END$$ 

所有我希望它做的是檢查,如果一個ID(主鍵)已經通過使用計數可能有ID的記錄存在。如果計數爲0,則可以使用上面的輸入參數添加記錄。

無論是否插入記錄,我希望所有具有與名稱輸入相匹配的'名稱'的記錄在更新的列中被賦予'true'。

無論我做什麼,它都不會更新更新列中的「真實」值。在這個SP的某處是不對的。我只是不確定它在哪裏。

回答

1

您的存儲過程對於此用例不是必需的。相反,這樣做:

INSERT INTO dim5players 
(id, name, rank_name, level, defender_rank_id, Organization, `Date`, Updated) 
VALUES 
(TRIM(uid), TRIM(cname), rank_name, clevel, defrank, cfaction, org, today, TRUE) 
ON DUPLICATE KEY UPDATE 
Updated = VALUES(Updated); 

UPDATE dim5players SET Updated = TRUE WHERE name = TRIM(cname); 

這將有以下幾個原因性能要好得多:

  1. 存儲過程總是比做直SQL慢。

  2. 子句where TRIM(id) = TRIM(uid)不會使用索引,但會始終掃描整個表。

  3. 避免競爭條件。