Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mySQL中的存储过程问题_Mysql_Stored Procedures_Transactions - Fatal编程技术网

mySQL中的存储过程问题

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

对于类,我将创建一个名为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 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;?如果没有,错误是否有助于发现问题?顺便说一句,由于请求的信息特别长,如果您更新您的问题以包含此信息,则会更好。它比评论中的内容更容易阅读:-