Я создаю хранимую процедуру для создания опроса по свойству.
Сначала он получает ввод property id
.
Затем он вставляет новый опрос в мою survey
таблицу с автоматически увеличивающимся survey id
и соответствующим вводом property id
.
Наконец, процедура выполняет серию операций выбора и объединения и извлекает все questions
, которые связаны с property type
рассматриваемого property
.
Это не важная часть, так как она работает идеально и гладко.
Итак, раньше моя хранимая процедура вставляла опрос и показывала таблицу с одним столбцом question_description
со всеми вопросами для опроса этого свойства в своих строках. Вот этот код:
DELIMITER //
CREATE PROCEDURE GenerateSurvey (IN input INT)
BEGIN
INSERT INTO survey (property_id, cas_eval_id, checksum_xxx)
VALUES
(input, 'CAS-XXX-YYYY', 123);
SELECT subquery.question_description
FROM (
SELECT question.question_description,
property_type_question.property_type_id
FROM property_type_question
JOIN question
ON property_type_question.question_id = question.id
ORDER BY question.id
) AS subquery
JOIN property
ON subquery.property_type_id = property.property_type_id
WHERE property.id = input;
END //
DELIMITER ;
Проблема в том, что вместе с показанными вопросами я теперь хочу показать идентификатор опроса, к которому относятся указанные вопросы. Итак, чтобы сделать это, я пытаюсь сделать это:
DELIMITER //
CREATE PROCEDURE GenerateSurvey (IN input INT)
BEGIN
INSERT INTO survey (property_id, cas_eval_id, checksum_xxx)
VALUES
(input, 'CAS-XXX-YYYY', 123);
SELECT survey.id AS 'Survey ID',
subquery.question_description
FROM (
SELECT question.question_description,
property_type_question.property_type_id
FROM property_type_question
JOIN question
ON property_type_question.question_id = question.id
ORDER BY question.id
) AS subquery
JOIN property
ON subquery.property_type_id = property.property_type_id
WHERE property.id = input;
END //
DELIMITER ;
Это дает мне следующую ошибку:
Итак, MySQL не распознает survey.id
.
Но survey.id
существует. Он просто вставляется в тот же запрос, что и выше, и просто не отображается в коде, потому что это автоматически увеличивающийся первичный ключ для моей таблицы survey
.
Итак, как мне сохранить способности моей процедуры:
И добавить возможность отображать идентификатор опроса вместе с вопросами?
Я использую Uwamp и MySQL Workbench 6.2.5.
Спасибо!
Причина, по которой он жалуется, заключается в том, что в вашем втором запросе нет survey
, на который он может ссылаться, у вас есть только subquery
и property
. Есть хитрый трюк, который вы можете сделать, чтобы фактически получить идентификатор последней вставленной строки: LAST_INSERT_ID()
. Поэтому просто перепишите свою процедуру следующим образом:
DELIMITER //
CREATE PROCEDURE GenerateSurvey (IN input INT)
BEGIN
INSERT INTO survey (property_id, cas_eval_id, checksum_xxx)
VALUES
(input, 'CAS-XXX-YYYY', 123);
SELECT LAST_INSERT_ID() AS 'Survey ID',
subquery.question_description
FROM (
SELECT question.question_description,
property_type_question.property_type_id
FROM property_type_question
JOIN question
ON property_type_question.question_id = question.id
ORDER BY question.id
) AS subquery
JOIN property
ON subquery.property_type_id = property.property_type_id
WHERE property.id = input;
END //
DELIMITER ;
И тебе должно быть хорошо идти.
Предполагая, что survey.id
является столбцом AUTO INCREMENT
, вы можете использовать LAST_INSERT_ID()
для получения его значения. Без аргументов,
LAST_INSERT_ID()
returns a BIGINT UNSIGNED (64-bit) value representing the first automatically generated value successfully inserted for an AUTO_INCREMENT column as a result of the most recently executed INSERT statement.
Таким образом, вы можете просто изменить
SELECT survey.id AS 'Survey ID',
к
SELECT LAST_INSERT_ID() AS 'Survey ID',
Чтобы получить последнее значение survey.id
.
Один из этих ответов решил вашу проблему? Если нет, не могли бы вы предоставить больше информации, чтобы помочь ответить на него? В противном случае, пожалуйста, подумайте о том, чтобы отметить принятый ответ, который лучше всего решил вашу проблему (галочка под стрелками вверх/вниз). См. stackoverflow.com/help/someone-answers