我遇到了这个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
);
答案 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"
然而,这只会因为您在存储过程中使用而起作用。