Mysql和mybatis使用foreach插入到select中

问题描述 投票:0回答:1

我有一个元素列表 [a, b, c, d]。 我还有一个名为 Ticket 的表,如下所示:

order_pnr_id             bigint unsigned  default '0'    not null,
order_id                 bigint unsigned  default '0'    not null,
reference_ticket_id      bigint unsigned  default '0'    not null,

我要将数据插入到一个新表中,但我想从ticket表中获取数据并直接插入。但是,我还想通过迭代列表来插入元素列表 [a, b, c, d]。

我知道我可以使用 INSERT INTO SELECT FROM... 子句,但如何同时迭代列表?我可以将 foreach 与子句一起使用吗?

理想情况下,我希望它能够工作:

INSERT INTO new_table
(
    order_pnr_id,
    order_id,
    reference_ticket_id,
    new_element

)
<foreach item="elem" collection="elements" open="(" separator="," close=")">
SELECT
    order_pnr_id,
    order_id,
    reference_ticket_id
    #{elem}
FROM
    ticket
WHERE
    order_id = 1

</foreach>

所以这会插入四行

mysql mybatis
1个回答
0
投票

要实现此目的,您可以在数据库中使用存储过程或类似的结构来允许循环或迭代。

-- Create a temporary table to hold the elements
CREATE TEMPORARY TABLE temp_elements (
    id INT AUTO_INCREMENT PRIMARY KEY,
    element VARCHAR(255)
);

-- Insert elements into the temporary table
INSERT INTO temp_elements (element) VALUES ('a'), ('b'), ('c'), ('d');

-- Create a stored procedure to iterate over the elements and insert into new_table
DELIMITER //
CREATE PROCEDURE insert_elements()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE elem VARCHAR(255);

    -- Cursor to fetch elements from temp_elements
    DECLARE cur CURSOR FOR SELECT element FROM temp_elements;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    -- Temporary table to hold the result of the SELECT query
    CREATE TEMPORARY TABLE temp_result (
        order_pnr_id BIGINT UNSIGNED DEFAULT '0' NOT NULL,
        order_id BIGINT UNSIGNED DEFAULT '0' NOT NULL,
        reference_ticket_id BIGINT UNSIGNED DEFAULT '0' NOT NULL,
        new_element VARCHAR(255)
    );

    OPEN cur;

    read_loop: LOOP
        FETCH cur INTO elem;
        IF done THEN
            LEAVE read_loop;
        END IF;

        -- Insert into temp_result using the SELECT statement
        INSERT INTO temp_result (order_pnr_id, order_id, reference_ticket_id, new_element)
        SELECT order_pnr_id, order_id, reference_ticket_id, elem
        FROM ticket
        WHERE order_id = 1;
    END LOOP;

    CLOSE cur;

    -- Insert from temp_result into new_table
    INSERT INTO new_table (order_pnr_id, order_id, reference_ticket_id, new_element)
    SELECT order_pnr_id, order_id, reference_ticket_id, new_element FROM temp_result;

    -- Drop temporary tables
    DROP TEMPORARY TABLE temp_elements;
    DROP TEMPORARY TABLE temp_result;
END //
DELIMITER ;

-- Call the stored procedure
CALL insert_elements();
© www.soinside.com 2019 - 2024. All rights reserved.