mysql 创建sql过程,但它未出现在表中

rnmwe5a2  于 2023-01-25  发布在  Mysql
关注(0)|答案(1)|浏览(138)

没有错误,但也不表示成功
起初,它只显示在表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 ;
zwghvu4y

zwghvu4y1#

您没有提供足够的详细信息,我们无法提供任何具体的答案。将表的DDL添加到您的问题中是获得真实的答案的最低要求。
话虽如此,这里有一些建议。
我们对需要存储在credit(和total_credit)中的值一无所知,但看起来它应该是DECIMAL,而不是FLOAT。在此处搜索decimal vs float将返回Float vs Decimal in ActiveRecord作为第一个结果。
如果你使用MySQL Workbench,错误/警告应该显示在输出区域(视图-〉面板-〉显示输出区域),或者你可以在调用SP后运行SHOW WARNINGS;

CALL createRegist();
SHOW WARNINGS;

第一次插入registrations时,registration_id的硬编码值为1,这可能是表的主键(PK)。第二次执行SP时,它尝试将1插入PK,但会失败,并出现重复键错误-

Error Code: 1062. Duplicate entry '1' for key 'registrations.PRIMARY'

然后,您可以继续调用LAST_INSERT_ID(),但它不会像您预期的那样工作。
如果将行的AUTO_INCREMENT列设置为非“幻数”值(即非NULL也非0的值),则LAST_INSERT_ID()的值不会更改。
将insert语句中传递的值更改为NULL或0(或完全删除)将解决此问题-

/* Passing in value of NULL */
set total_credit = 0;
insert into `student_regist`.`registrations` (`registration_id`, `student_id`,`total_credit`)
    values (NULL, 1, total_credit);

/* or removing completely */
set total_credit = 0;
insert into `student_regist`.`registrations` (`student_id`,`total_credit`)
    values (1, total_credit);

相关问题