MySql COUNT (*) отличается в хранимой процедуре - PullRequest
4 голосов
/ 08 июня 2011

Я работаю над системой «оценок» и пытаюсь убедиться, что человек не может дважды подать оценку, используя хранимую процедуру, которая проверит, оценил ли человек определенный элемент, прежде чем разрешить новыйоценка будет сохранена.Странно то, что я передаю идентификатор пользователя и идентификатор объекта, но когда моя хранимая процедура выбирает COUNT (*), я получаю неправильный номер.

Вот моя хранимая процедура:

CREATE PROCEDURE `ADD_GRADE`(IN objectID int, IN grader int)
BEGIN
DECLARE gradeCount INT;

SELECT COUNT(*)
FROM GRADES
WHERE Obj_ID = objectID AND Grader = grader
INTO gradeCount;

IF gradeCount <= 0 THEN INSERT INTO Grades (Obj_ID, Grader) VALUES (objectID, grader);
END IF;

Оператор IF работает, но по какой-то причине мой gradeCount, похоже, игнорирует идентификатор грейдера и просто проверяет на основе Obj_ID.Я добавил селекторы, чтобы убедиться, что мои параметры остаются на правильном значении, и они есть.Если я скопирую только select и сделаю это в другом месте вручную, я получу правильное число.

Хотя я новичок в MySql, я не новичок в самом SQL.Я просто схожу с ума?Или я что-то не так делаю?

Спасибо

Ответы [ 2 ]

11 голосов
/ 08 июня 2011

Даже если этот код работает (я не знаю, почему это не так), это не правильный способ убедиться, что что-то вводится только один раз.

Правильный способ - применить уникальное ограничение к столбцам objectID и grader. Затем попробуйте вставить строку. Если строка вставляется, то значения являются уникальными. Если вы получили уникальное нарушение, то значения уже были введены.

Если у вас нет доступных уникальных ограничений, вам следует заблокировать таблицу, чтобы убедиться, что между вашими командами не происходит никаких других обновлений.

7 голосов
/ 08 июня 2011

Я предполагаю, что MySQL нечувствителен к регистру имен полей, а код

Grader = grader

просто сравнивает столбец с самим собой, что всегда верно.вам может потребоваться переименовать передаваемый параметр, чтобы он не имел того же имени, что и существующий столбец.Обычно все аргументы хранимой процедуры обрабатываются с помощью __ (двойное подчеркивание), поэтому я не сталкиваюсь с подобными ситуациями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...