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

存在两张表,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. 打印 laravel 模型查询产品的 SQL

    1.在路由閉包打印sql 打印一段代码生产的 sql 语句,使用路由闭包做个实验 Route::get('/get-sql', function() { DB::enableQueryLog(); $ ...

  2. LiveBindings --- 把对象之间的属性绑定起来

    有了 FireMonkey 框架,它不同于 VCL ,以往的数据感知控件不能放在它上面,所以 XE2 提供了 LiveBindings 功能作为替代方案.另外它也是个通用的基础设施,同样可用于传统的V ...

  3. NotePad++ 配置Python工作环境

    下载地址:https://notepad-plus-plus.org/ Current Version: 7.5.3 sss 显示空格和指标符 为什么建议这么作?因为判断Python语句是否在同一层次 ...

  4. 20175227张雪莹 2018-2019-2 《Java程序设计》第三周学习总结

    20175227张雪莹 2018-2019-2 <Java程序设计>第三周学习总结 教材学习内容总结 (仅在此列举个性化学习总结) 一.编程语言的几个发展阶段. 1.面向机器语言:汇编语言 ...

  5. Scrapy学习篇(十二)之设置随机IP代理(IPProxy)

    当我们需要大量的爬取网站信息时,除了切换User-Agent之外,另外一个重要的方式就是设置IP代理,以防止我们的爬虫被拒绝,下面我们就来演示scrapy如何设置随机IPProxy. 设置随机IPPr ...

  6. C++Primer第五版——习题答案详解(九)

    习题答案目录:https://www.cnblogs.com/Mered1th/p/10485695.html 第10章 泛型算法 练习10.1 #include<iostream> #i ...

  7. django 分页和中间件

    分页 Django的分页器(paginator) view from django.shortcuts import render,HttpResponse # Create your views h ...

  8. Python 爬虫 Vimeo视频下载链接

    python vimeo_d.py https://vimeo.com/228013581 在https://vimeo.com/上看到稀罕的视频 按照上面加上视频的观看地址运行即可获得视频下载链接 ...

  9. Java 学习 注解

    转载:https://blog.csdn.net/briblue/article/details/73824058 注解语法 因为平常开发少见,相信有不少的人员会认为注解的地位不高.其实同 class ...

  10. [UnityAPI]DataUtility类

    测试环境: 准备三张图片a,b,c,其中a,b打在同一图集,c不打图集,a,b如下: 测试脚本: using UnityEngine; using UnityEngine.Sprites; publi ...