以供将来参考:
在我的数据库中,所有关联实体中都带有“ $”字符。
例如,“ property_type $ question”表将我的“ property_type”表和“ question”表相关联。
我正在创建此存储过程来为给定属性生成调查:
/*---------- PROCEDURE TO GENERATE SURVEY FOR A PROPERTY ----------*/
DELIMITER //
CREATE PROCEDURE GenerateSurvey (IN input_property_id INT)
BEGIN
INSERT INTO survey (checksum_xxx, cas_id)
VALUES
(123, 'CAS-XXX-YYYY');
SELECT LAST_INSERT_ID() INTO @last_survey_id;
INSERT INTO property$survey (property_id, survey_id)
VALUES
(input_property_id, @last_survey_id);
SELECT property_type$question.question_id
INTO @survey_questions
FROM (
SELECT property.id AS 'property_id',
property_type.id AS 'property_type_id'
FROM property JOIN property_type
ON property.property_type_id = property_type.id
WHERE property.id = input_property_id
) AS subquery join property_type$question
ON subquery.property_type_id = property_type$question.property_type_id
WHERE subquery.property_id = input_property_id;
INSERT INTO survey$question$answer (survey_id, question_id)
VALUES
(@last_survey_id, @survey_questions);
END //
DELIMITER ;
我怀疑在插入survey$question$answer
表中时,此错误在存储过程的最后一次INSERT发生。
由于@last_survey_id
包含一个调查ID,但是@survey_questions
包含多个问题ID,因此返回错误。
我想在survey$question$answer
表中插入多行。
每行应具有相同的survey_id
(存储在@last_survey_id
中),但每一行应具有不同的question_id
值(存储在@survey_questions
中)。
例如:
如果对于ID为2的调查,属于ID为4、5和6的问题,我希望它看起来像这样:
survey_id | question_id
2 | 4
2 | 5
2 | 6
但是,并非每个调查都具有相同数量的问题。 这意味着我不能真正使用以下格式的插入:
INSERT INTO survey$question$answer (survey_id, question_id)
VALUES
(@last_survey_id, @survey_questions);
(@last_survey_id, @survey_questions);
(@last_survey_id, @survey_questions);
因为没有办法知道调查将有多少个问题。
因此,调查3可能会遇到问题10、20、30、40和50。
这应该导致:
survey_id | question_id
3 | 10
3 | 20
3 | 30
3 | 40
3 | 50
那么我该如何遍历@survey_questions
中的所有值,并为每个不同的值插入一行,然后同时为每一行插入相同的值(在@last_survey_id
中)?
如果我将它们分开做,会更好吗?
也许首先插入所有question_id
,然后更新各行以为每行包含相同的survey_id
?我在弄清楚我将如何执行此操作时遇到了麻烦...
谢谢!
答案 0 :(得分:1)
我怀疑生成错误是因为您尝试将多个值存储在一个标量变量中。您可以直接将查询结果插入表中,而不必使用变量@survey_questions
来获取。
删除最后一个SELECT
和最后一个INSERT
并放入:
INSERT INTO survey$question$answer
(survey_id,
question_id)
SELECT @last_survey_id,
property_type$question.question_id
FROM (SELECT property.id property_id,
property_type.id property_type_id
FROM property
INNER JOIN property_type
ON property.property_type_id = property_type.id
WHERE property.id = input_property_id) subquery
INNER JOIN property_type$question
ON subquery.property_type_id = property_type$question.property_type_id
WHERE subquery.property_id = input_property_id;