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

存在两张表,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'', 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就要执行,这是我们不希望看到的

MySQL往表里插入千条数据 存储过程的更多相关文章

  1. mysql一次插入多条数据

    mysql一次插入多条数据: INSERT INTO hk_test(username, passwd) VALUES ('qmf2', 'qmf2'),('qmf3', 'qmf3'),('qmf4 ...

  2. mysql中造3千条数据(3种方法)

    方法一:存储过程 1.存储过程如下: delimiter $$ DROP PROCEDURE IF EXISTS data CREATE PROCEDURE data(in i int) BEGIN ...

  3. MySql LAST_INSERT_ID 【插入多条数据时】

    LAST_INSERT_ID 自动返回最后一个 INSERT 或 UPDATE 操作为 AUTO_INCREMENT 列设置的第一个发生的值. 参考这里 The ID that was generat ...

  4. WebGIS项目中利用mysql控制点库进行千万条数据坐标转换时的分表分区优化方案

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1. 背景 项目中有1000万条历史案卷,为某地方坐标系数据,我们的真实 ...

  5. mysql命令行批量插入100条数据命令

    先介绍一个关键字的使用: delimiter 定好结束符为"$$",(定义的时候需要加上一个空格) 然后最后又定义为";", MYSQL的默认结束符为" ...

  6. PHP MySQL 插入多条数据

    PHP MySQL 插入多条数据 使用 MySQLi 和 PDO 向 MySQL 插入多条数据 mysqli_multi_query() 函数可用来执行多条SQL语句. 以下实例向 "MyG ...

  7. 用一条mysql语句插入多条数据

    这篇文章主要介绍了在mysql中使用一条sql语句插入多条数据,效率非常高,但是原理其实很简单,希望对大家有所帮助 假如有一个数据表A: id name title addtime 如果需要插入n条数 ...

  8. 你向 Mysql 数据库插入 100w 条数据用了多久?

    阅读本文大概需要 2 分钟. ▌目录 多线程插入(单表) 多线程插入(多表) 预处理 SQL 多值插入 SQL 事务( N 条提交一次) ▌多线程插入(单表) 问:为何对同一个表的插入多线程会比单线程 ...

  9. 使用 MySQLi 和 PDO 向 MySQL 插入多条数据

    PHP MySQL 插入多条数据 使用 MySQLi 和 PDO 向 MySQL 插入多条数据 mysqli_multi_query() 函数可用来执行多条SQL语句. 以下实例向 "MyG ...

随机推荐

  1. 3.3-1933 problem A

    #include <stdio.h> int main(void){ int h; while(scanf("%d", &h) != EOF){ * (h-); ...

  2. delphi 下载

    最新(更多)内容,请到  http://www.cnblogs.com/key-ok/p/3465486.html  Borland Pascal v7.1 (13.89 Mb)  Delphi 1 ...

  3. 批处理关闭防火墙.bat

    批处理关闭防火墙.bat @echo offecho 用批处理关闭防火墙,包括家庭和工作网络位置.公用网络位置设置.netsh firewall set opmode mode=disable pro ...

  4. vm虚拟机 模板机进行克隆导致centos 7.2 无法加载网卡

    问题描述:vm虚拟机 模板机进行克隆导致centos 7.2 无法加载网卡. 1.ifconfig 查看网卡状态 lo: flags=<UP,LOOPBACK,RUNNING> mtu i ...

  5. 实验五:Xen环境下多虚拟机的桥接配置

    实验名称: Xen环境下多虚拟机的桥接配置 实验环境: 这里我们首先需要有一台已经安装好的虚拟机机,能够正常运行,且网卡正常,如下图: 实验需求: 进行虚拟机的复制,并添加新的网桥配置,然后将两台虚拟 ...

  6. Vue todolist练习 知识点

    1.localStorage的用法总结 (1).这儿是什么:局部存储器.它是html5新增的一个本地存储API,所谓localStorage就是一个小仓库的意思,它有5M的大小空间,存储在浏览器中,我 ...

  7. 七、XHTML介绍

    XHTML简介 1.什么是XHTML? XHTML指的是可扩展超文本标记语言 XHTML与HTML4.01几乎是相同的 XHTML是更严格更纯净的HTML版本 XHTML得到所有主流浏览器的支持 2. ...

  8. 权限管理demo-Http请求前后监听工具

    工具作用: 1. 输出每次请求的参数 2. 接口的请求时间 package com.mmall.common; import com.mmall.util.JsonMapper; import lom ...

  9. VS2010 永久配置OpenCv2.4.9 及转换到COFF 期间失败:文件无效或损坏,解决方法

    1.下载OpenCv2.4.9(win pack):http://opencv.org/releases.html 下载完成后,进行解压(win7 64位系统) 2.环境配置,配置如下图所示: 找到p ...

  10. py库: arrow (时间)

    arrow是个时间日期库,简洁易用.支持python3.6 https://arrow.readthedocs.io/en/latest/ arrow官网api https://github.com/ ...