zoukankan      html  css  js  c++  java
  • MySQL往表里插入千条数据 存储过程

    工作中遇到的问题,先记录一下,方便以后查看

    存在两张表,user表和friend表

    user表部分字段,如上图

    friend表部分字段,如上图

    往friend表插入千条数据,friend表中的userId值是固定的,对应的friendId是从user表中获取

    实现方案:

    1、游标存储:

    -- 在windows系统中写存储过程时,如果需要使用declare声明变量,需要添加这个关键字,否则会报错。  
    delimiter //  
    drop procedure if exists insertUserFriend;
    CREATE PROCEDURE insertUserFriend(id int, idx int, size int)
    BEGIN  
        -- 创建接收游标数据的变量  
        declare c int;
        -- 创建结束标志变量  
        declare done int default FALSE;
        -- 创建游标  
        declare cur cursor for select userId from u_user where userId != id LIMIT idx, size;
        -- 指定游标循环结束时的返回值  
        declare continue HANDLER for not found set done = TRUE;
        -- 打开游标  
        open cur;  
        -- 开始循环游标里的数据  
        read_loop:loop  
        -- 根据游标当前指向的一条数据  
        fetch cur into c;
        -- 判断游标的循环是否结束  
        if done then
            leave read_loop;    -- 跳出游标循环  
        end if;
            INSERT INTO u_user_friend (userId, friendId, createTime, lastExchangeTime) VALUES (id, c, NOW(), NOW());
        -- 结束游标循环  
        end loop;  
        -- 关闭游标  
        close cur;  
        -- 输出结果  
        select * from u_user_friend WHERE userId = id;  
    END;  
    //
    -- 调用位置修改值就可以,不用重建存储过程
    CALL insertUserFriend(7071, 0, 5082);

    2、while循环---待测试

    DELIMITER;//
    create procedure myproc()
    begin
    declare num int;
    declare num1 int;
    DECLARE oldUserId int;
    DECLARE newUserId int;
    DECLARE isExist int;-- 用于验证是否存在好友关系
    set num=1;
    set num1=1;
    set oldUserId=0;
    set newUserId=0;
    set isExist=0;
    while num <= 100 do
        select min(userId) into  oldUserId from u_user where userId>oldUserId;
        set num1=1;
        while num1 <= 1000 do
            set newUserId=newUserId+1;
            select min(userId) into  newUserId from u_user where userId>newUserId;
            if (newUserId>0 and oldUserId>0) 
            THEN
                select count(userId) into isExist  from u_user_friend where (userId=oldUserId and friendId=newUserId) or (userId=newUserId and friendId=oldUserId);
                if(isExist=0) THEN
                    INSERT INTO `u_user_friend` 
                    (`userId`, `friendId`, `memo`, `des`, `img`, `mps`, `black`, `createTime`, `blackTime`, `lastExchangeTime`) 
                    VALUES
                    (oldUserId, newUserId, NULL, NULL, NULL, NULL, b'0', NOW(), NOW(), NOW());
                END IF;
            END IF;
            set num1=num1+1;
            set isExist=0;
        end while;
        set oldUserId=oldUserId+1;
        set num=num+1;
    end while;
    commit;
    end;//
    
    
    -- 执行存储过程
    CALL myproc();
    
    -- 删除存储过程
    -- drop PROCEDURE myproc
    
    -- 清空u_user_friend里面的所有数据(慎用)
    -- truncate table u_user_friend

    附:

    delimiter的作用:告诉解释器,这段命令是否已经结束了,mysql是否可以执行了 
    默认情况下,delimiter是‘;’但是当我们编写procedure时,如果是默认设置,那么一遇到‘;’,mysql就要执行,这是我们不希望看到的

  • 相关阅读:
    innodb的innodb_buffer_pool_size和MyISAM的key_buffer_size(转自:http://www.java123.net/898181.html)
    mysql max_allowed_packet参数值改大后,莫名被还原
    windows MySQL5.7.9免安装版配置方法
    centos7.2启动级别
    saltstack
    Jmeter -- 参数化(函数助手和CSV数据文件配置)
    Jmeter -- 上下文关联(JSON提取器)
    LBS 基于位置的服务
    uiautomatorviewer报错 Error taking device screenshot: EOF
    python中加入中文注释报错处理
  • 原文地址:https://www.cnblogs.com/chenchen-tester/p/8469760.html
Copyright © 2011-2022 走看看