-- 示例代码:将一条数据拆分成多条
-- 假设有一个表 `orders`,其中有一条记录包含多个商品信息,我们希望将其拆分成多条记录。
-- 原始表结构
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_name VARCHAR(100),
product_info TEXT
);
-- 插入示例数据
INSERT INTO orders (order_id, customer_name, product_info) VALUES
(1, '张三', '苹果,香蕉,橙子');
-- 目标是将 `product_info` 中的商品信息拆分成多条记录,并插入到新表 `order_details` 中
CREATE TABLE order_details (
detail_id INT AUTO_INCREMENT PRIMARY KEY,
order_id INT,
product_name VARCHAR(100)
);
-- 使用存储过程或函数来拆分数据并插入到新表中
DELIMITER $$
CREATE PROCEDURE SplitOrderProducts()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE orderId INT;
DECLARE productName VARCHAR(100);
DECLARE cur CURSOR FOR SELECT order_id, SUBSTRING_INDEX(SUBSTRING_INDEX(product_info, ',', n.n), ',', -1)
FROM orders CROSS JOIN
(SELECT a.N + b.N * 10 + 1 n FROM
(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a,
(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
) n
WHERE LENGTH(product_info) - LENGTH(REPLACE(product_info, ',', '')) >= n.n - 1;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop: LOOP
FETCH cur INTO orderId, productName;
IF done THEN
LEAVE read_loop;
END IF;
INSERT INTO order_details (order_id, product_name) VALUES (orderId, productName);
END LOOP;
CLOSE cur;
END$$
DELIMITER ;
-- 调用存储过程来执行拆分操作
CALL SplitOrderProducts();
-- 查询结果
SELECT * FROM order_details;
orders 表中包含订单 ID、客户姓名和商品信息。商品信息是以逗号分隔的字符串。product_info 中的商品信息拆分成多条记录,并插入到新表 order_details 中。SplitOrderProducts 来实现拆分逻辑。通过生成一个数字序列并与 orders 表进行交叉连接,逐个提取商品名称并插入到 order_details 表中。CALL SplitOrderProducts() 来完成数据拆分。order_details 表以验证拆分结果。如果你有其他需求或问题,请随时告诉我!
上一篇:mysql日期大于某个日期
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站