我有一个元素列表 [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>
所以这会插入四行
要实现此目的,您可以在数据库中使用存储过程或类似的结构来允许循环或迭代。
-- 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();