没有错误,但也不表示成功
起初,它只显示在表registrations中,而不显示在registration_details中,现在它不会同时显示在这两个表中。
set foreign_key_checks = 0;
drop procedure if exists createRegist;
delimiter //
create procedure createRegist()
begin
declare total_credit float;
declare registration_id INT;
declare credit float;
-- create first registration for student 1
set total_credit = 0;
insert into `student_regist`.`registrations` (`registration_id`, `student_id`,`total_credit`)
values (1, 1, total_credit);
SELECT LAST_INSERT_ID() INTO registration_id;
-- create registration detail 1
SELECT
`student_regist`.`courses`.`credit`
INTO credit FROM
`student_regist`.`courses`
WHERE
`student_regist`.`courses`.`course_id` = 1
LIMIT 1;
set total_credit = total_credit + credit;
insert into `student_regist`.`registration_details` (`registration_details_id`, `registration_id`, `course_id`, `semester`)
values (1, 1, 1, 1);
SELECT 'Success';
end//
delimiter ;
1条答案
按热度按时间zwghvu4y1#
您没有提供足够的详细信息,我们无法提供任何具体的答案。将表的DDL添加到您的问题中是获得真实的答案的最低要求。
话虽如此,这里有一些建议。
我们对需要存储在
credit
(和total_credit
)中的值一无所知,但看起来它应该是DECIMAL
,而不是FLOAT
。在此处搜索decimal vs float将返回Float vs Decimal in ActiveRecord作为第一个结果。如果你使用MySQL Workbench,错误/警告应该显示在输出区域(视图-〉面板-〉显示输出区域),或者你可以在调用SP后运行
SHOW WARNINGS;
。第一次插入
registrations
时,registration_id
的硬编码值为1,这可能是表的主键(PK)。第二次执行SP时,它尝试将1插入PK,但会失败,并出现重复键错误-然后,您可以继续调用
LAST_INSERT_ID()
,但它不会像您预期的那样工作。如果将行的AUTO_INCREMENT列设置为非“幻数”值(即非NULL也非0的值),则LAST_INSERT_ID()的值不会更改。
将insert语句中传递的值更改为NULL或0(或完全删除)将解决此问题-