Laravel  
laravel
文档
数据库
架构
入门
php技术
    
Laravelphp
laravel / php / java / vue / mysql / linux / python / javascript / html / css / c++ / c#

mysql一条数据拆分成多条

作者:为你丶偶尔温柔一次   发布日期:2025-11-05   浏览:116

-- 示例代码:将一条数据拆分成多条

-- 假设有一个表 `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;

解释说明:

  1. 原始表结构orders 表中包含订单 ID、客户姓名和商品信息。商品信息是以逗号分隔的字符串。
  2. 目标:将 product_info 中的商品信息拆分成多条记录,并插入到新表 order_details 中。
  3. 存储过程:使用存储过程 SplitOrderProducts 来实现拆分逻辑。通过生成一个数字序列并与 orders 表进行交叉连接,逐个提取商品名称并插入到 order_details 表中。
  4. 调用存储过程:执行 CALL SplitOrderProducts() 来完成数据拆分。
  5. 查询结果:最后查询 order_details 表以验证拆分结果。

如果你有其他需求或问题,请随时告诉我!

上一篇:mysql日期大于某个日期

下一篇:windows查看是否安装mysql

大家都在看

mysqlavg函数保留小数

mysql显示表内容

mysql经纬度距离计算

mysql 加密

存储过程mysql

mysql 1265

mysql with语句

mysql时间加减

mysql查询表名,模糊匹配

brew 启动mysql

Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3

Laravel 中文站