mysql - mySQL 中的存储过程问题

标签 mysql stored-procedures transactions

对于类,我将创建一个名为 add_parts 的存储过程,它将用于将记录添加到 parts_service 表中。它有 2 个输入参数,与该表中的part_id 和parts_qty 字段/数据类型相匹配。我还必须声明一个变量,该变量将保留另一个表服务中的 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);

最后一行中的 CALL 应返回“记录已添加!”而是返回“您输入的部件 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,

尝试将 parts_qty 插入 service_id 时,查询(对 service 表有约束)一定会失败。

将插入内容切换为:

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);

关于mysql - mySQL 中的存储过程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58848228/

相关文章:

python - App Engine MySQL 连接到远程数据库失败

mysql - 循环记录并更新付费状态

php - 这是使用交易的好例子吗?

php - 我该如何解决这个 Solr/MySQL 竞争条件?

MySQL 搜索汉字

java - 如何使用存储过程获取Select后的主键值?

java - EntityManager.contains - 在同一事务中返回 false

java - JdbcMutableAclService - 事务必须正在运行

javascript - 如何使用 JS (Node.js) 防止 HTTP 查询中允许使用 UTF8 字符串?

mysql - 不正确的日期值 : '0000-00-00' for column 'req_dt' at row in mysql