COUNT(*)

时间:2016-06-27 14:38:34

标签: mysql sql

我遇到了这个SQL的问题。由于某种原因,插入到wCount中的值总是为1.我已经使用我知道应该评估为0的值对其进行了测试,但它仍然在程序中出现为1.我还测试了它自己的SELECT的过程,结果为0,使用相同的值。这里出了什么问题?

-- Add user role to table if user does not already have that role assigned to them

CREATE PROCEDURE `new_user_role`(IN userID INT(11), IN roleID INT(11))
BEGIN   
DECLARE wCount INT DEFAULT 0;

SELECT COUNT(*)
INTO wCount
FROM userrole
WHERE RoleID = roleID
AND UserID = userID;

IF wCount = 0 THEN
    INSERT INTO userrole(UserID, RoleID) VALUES(userID, roleID);
END IF;
END

这是create table语句

CREATE TABLE `userrole` (
`URKey` bigint(20) NOT NULL AUTO_INCREMENT,
`UserID` int(11) NOT NULL,
`RoleID` int(11) NOT NULL,
PRIMARY KEY (`URKey`),
KEY `FK_UserRole_User_idx` (`UserID`),
KEY `FK_UserRole_Role_idx` (`RoleID`),
CONSTRAINT `FK_UserRole_Role` FOREIGN KEY (`RoleID`) REFERENCES `role`   (`RoleID`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `FK_UserRole_User` FOREIGN KEY (`UserID`) REFERENCES `user` (`UserID`) ON DELETE CASCADE ON UPDATE CASCADE

);

2 个答案:

答案 0 :(得分:0)

您正在传递名为userID和roleID的参数,可能认为它们与列名RoleID和UserID不同。如果传递名为(说)XuserID和XroleID的参数,然后在WHERE子句中使用“WHERE RoleID = XroleID AND UserID = XuserID”,我预测你会得到更像你希望的东西。

答案 1 :(得分:0)

问题在于参数'名。如果要保留这些名称,则必须使用别名来限定表列的范围: MySql Stored Procedure's parameter with the same name as affecting's column, is it possible?

即使找到了您的查询问题,如果我正确理解您的目标,您要尝试做的是检查某个值是否存在"在插入之前。

如果是这样,为什么不尝试这样做:

IF NOT EXISTS (SELECT * FROM userrole WHERE  RoleID = varRoleID AND AND UserID = varUserID) THEN
     INSERT INTO userrole(UserID, RoleID) VALUES(varUserID, varRoleID);
END IF;

它与此类似: Usage of MySQL's "IF EXISTS"

然而,这只会因为您在存储过程中使用而起作用。