用于更新两个表的MySQL存储过程(第二个表的值从第一个表自动递增)
我想同时更新数据库中的两个表。一个表用于组,另一个表用于组成员:用于更新两个表的MySQL存储过程(第二个表的值从第一个表自动递增),mysql,stored-procedures,Mysql,Stored Procedures,我想同时更新数据库中的两个表。一个表用于组,另一个表用于组成员: CREATE TABLE IF NOT EXISTS groups ( group_id INTEGER UNSIGNED AUTO_INCREMENT, group_name VARCHAR(150) NOT NULL DEFAULT '', group_created TIMESTAMP DEFAULT CURRENT_T
CREATE TABLE IF NOT EXISTS groups (
group_id INTEGER UNSIGNED AUTO_INCREMENT,
group_name VARCHAR(150) NOT NULL DEFAULT '',
group_created TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (group_id)
) ENGINE=InnoDB DEFAULT CHARACTER SET utf8;
CREATE TABLE IF NOT EXISTS group_members (
group_mem_user_id INTEGER UNSIGNED NOT NULL,
group_mem_group_id INTEGER UNSIGNED NOT NULL,
group_mem_role TINYINT DEFAULT 1,
group_mem_created TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT group_mem_pk PRIMARY KEY (group_mem_user_id, group_mem_group_id),
FOREIGN KEY (group_mem_user_id) REFERENCES user (user_id),
FOREIGN KEY (group_mem_group_id) REFERENCES groups (group_id)
) ENGINE=InnoDB DEFAULT CHARACTER SET utf8;
我想使用存储过程在group
中创建一个条目,并在group\u members
中使用刚刚为该组创建的id创建一个条目
我知道如何在服务器上实现这一点(我有一个java服务器,我使用Spring的JdbcTemplate调用数据库),但我认为在存储过程中实现这一点会更好、更高效
DELIMITER //
DROP PROCEDURE IF EXISTS create_group //
CREATE PROCEDURE create_group(
#in/out here
)
BEGIN
#no idea
END //
DELIMITER ;
两个单独的查询是(我使用准备好的语句):
及
但我不知道如何将这些合并到一个存储过程中
DELIMITER //
DROP PROCEDURE IF EXISTS create_group //
CREATE PROCEDURE create_group(
#in/out here
)
BEGIN
#no idea
END //
DELIMITER ;
理想情况下,我希望它返回一些描述操作是否成功的值。我使用以下过程:
DELIMITER //
DROP PROCEDURE IF EXISTS create_group //
CREATE PROCEDURE create_group(
IN create_group_group_name VARCHAR(150),
IN create_group_user_id INT
)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
BEGIN
ROLLBACK;
END;
START TRANSACTION;
INSERT INTO groups (group_name) VALUES (create_group_group_name);
INSERT INTO group_members (group_mem_user_id, group_mem_group_id, group_mem_role) VALUES (create_group_user_id, LAST_INSERT_ID(), 2);
COMMIT;
END //
DELIMITER ;
在我的服务器中,我使用它的方式如下:
JdbcTemplate jt = new JdbcTemplate(DB.getDataSource(DB_USER));
int i = jt.update("CALL create_group (?,?)", new Object[] {groupName, userId});
if (i != 1)
throw new SQLException("Error creating group with name=" + groupName + " for userid=" + userId);
i==1
如果一切顺利。如果用户不是作为成员添加的,则永远不会创建组(通过下面我的第一次迭代解决了这个问题)
旧的
(非事务性,如果第二次插入失败会导致问题,然后创建的组中没有成员,在某些情况下可能会工作,这就是为什么我将其保留在此处,但它对我不起作用)
以下步骤有效。它没有返回任何内容,我只是利用过程完成时没有错误这一事实来假设一切正常
DELIMITER //
DROP PROCEDURE IF EXISTS create_group //
CREATE PROCEDURE create_group(
IN create_group_group_name VARCHAR(150),
IN create_group_user_id INT
)
BEGIN
INSERT INTO groups (group_name) VALUES (create_group_group_name);
INSERT INTO group_members (group_mem_user_id, group_mem_group_id, group_mem_role) VALUES (create_group_user_id, LAST_INSERT_ID(), 2);
END //
DELIMITER ;
DELIMITER //
DROP PROCEDURE IF EXISTS create_group //
CREATE PROCEDURE create_group(
IN create_group_group_name VARCHAR(150),
IN create_group_user_id INT
)
BEGIN
INSERT INTO groups (group_name) VALUES (create_group_group_name);
INSERT INTO group_members (group_mem_user_id, group_mem_group_id, group_mem_role) VALUES (create_group_user_id, LAST_INSERT_ID(), 2);
END //
DELIMITER ;