Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.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 - Fatal编程技术网

用于更新两个表的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 ;