MYSQL存储过程不更新列

时间:2013-05-02 02:59:19

标签: mysql stored-procedures parameters

我整天都在工作,试图让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,那么我可以使用上面的输入参数添加记录。

无论是否插入记录,我都希望所有具有与name输入相匹配的'name'的记录在更新列中被赋予'true'。

无论我做什么,它都不会更新更新列中的“true”值。这个SP的某个地方有些不对劲。我只是不确定它在哪里。

1 个答案:

答案 0 :(得分: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. 避免竞赛条件。