mySQL中的存储过程问题
对于类,我将创建一个名为add_parts的存储过程,用于将记录添加到parts_服务表中。它有两个输入参数,与该表中的零件id和零件数量字段/数据类型相匹配。我还必须声明一个变量,该变量将保存另一个表services中的service_id值,并使用select into将其设置为MAX。以下是我的代码:mySQL中的存储过程问题,mysql,stored-procedures,transactions,Mysql,Stored Procedures,Transactions,对于类,我将创建一个名为add_parts的存储过程,用于将记录添加到parts_服务表中。它有两个输入参数,与该表中的零件id和零件数量字段/数据类型相匹配。我还必须声明一个变量,该变量将保存另一个表services中的service_id值,并使用select into将其设置为MAX。以下是我的代码: /*Set DB context and drop the procedure if it exists (2 lines)*/ USE cf; DROP PROCEDURE IF EXIS
/*Set DB context and drop the procedure if it exists (2 lines)*/
USE cf;
DROP PROCEDURE IF EXISTS add_parts;
/*Delimiter statement (1 line)*/
DELIMITER //
/*Create procedure statement & 2 int parameters.*/
CREATE PROCEDURE add_parts (
IN part_id_param INT,
IN parts_qty_param INT
)
BEGIN
/*Declare the internal int variable (1 line)*/
DECLARE service_id_var INT;
/*Declare sql_error variable, Declare continue handler, set sql_error variable (3 lines)*/
DECLARE sql_error TINYINT DEFAULT FALSE;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
SET sql_error = TRUE;
/*Set the internal int variable */
/*From the appropriate table (3 lines)*/
SELECT MAX(service_id) INTO service_id_var FROM service;
START TRANSACTION;
/*Insert into parts_service values statement */
INSERT INTO parts_service VALUES(DEFAULT, part_id, part_qty, service_id_var);
/* If/else conditional; if sql_error variable is false, commit the transaction and select the appropriate message*/
/* else, rollback the transaction and select the appropriate message */
IF sql_error = FALSE THEN
COMMIT;
SELECT 'Record was added!' AS Message;
ELSE
ROLLBACK;
SELECT 'The part id you entered does not exist' AS Message;
END IF;
END//
CALL add_parts(15,7);
添加了最后一行中的呼叫应返回记录!而是返回您输入的零件id不存在。我如何判断我是否做得正确
CREATE TABLE parts_service (
parts_service_id int(11) NOT NULL AUTO_INCREMENT,
part_id int(11) NOT NULL,
service_id int(11) NOT NULL,
parts_qty int(11) DEFAULT NULL,
PRIMARY KEY (parts_service_id),
KEY ps_fk_parts (part_id),
KEY ps_fk_service (service_id),
CONSTRAINT ps_fk_parts FOREIGN KEY (part_id) REFERENCES parts (part_id),
CONSTRAINT ps_fk_service FOREIGN KEY (service_id) REFERENCES service (service_id)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
啊哈,这两个坏了:
service_id int(11) NOT NULL,
parts_qty int(11) DEFAULT NULL,
尝试将零件数量插入服务id时,对服务表具有约束的查询必须失败
将插入切换到以下位置:
INSERT INTO parts_service VALUES(DEFAULT, part_id, service_id_var, part_qty);
或者,这可能更好,您可以显式设置要将值放入的列:
INSERT INTO parts_service
(`parts_service_id`, `part_id`, `parts_qty`, `service_id`)
VALUES
(DEFAULT, part_id, part_qty, service_id_var);
我建议您查看删除处理程序所产生的错误。零件服务显示创建表零件服务的表定义是什么?创建表零件服务零件服务id int11不为空自动增量,零件id int11不为空,服务id int11不为空,零件数量int11默认为空,主键零件服务id,键ps\U fk\U零件id,键ps\U fk\U服务id,CONSTRAINT ps_fk_parts外键part_id引用parts part_id,CONSTRAINT ps_fk_服务外键服务\u id引用服务\u id ENGINE=InnoDB AUTO_INCREMENT=26默认字符集=utf8mb4 COLLATE=utf8mb4_0900\u ai_ciNo在mysql客户端中移除句柄时生成错误,您可以运行此查询而不出错吗?插入零件服务值默认值15、7,从服务中选择MAXservice\u id;?如果没有,错误是否有助于发现问题?顺便说一句,由于请求的信息特别长,如果您更新您的问题以包含此信息,则会更好。它比评论中的内容更容易阅读:-