2013-05-02 86 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. 避免竞争条件。