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

存在两张表,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. 第一章 C#入门 (Windows窗体应用程序)(三)

    [案例] 编写一个Windows窗体应用程序,窗体上有一个文本框和两个按钮([显示]和[清除]按钮). 单击[显示]时,文本框的背景变为蓝色并且居中显示“努力学习C#”: 单击[清除]按钮,文本框的背 ...

  2. 饥饿的牛(dp一维最大覆盖)

    问题 H: 饥饿的牛 时间限制: 1 Sec  内存限制: 128 MB提交: 12  解决: 12[提交][状态][讨论版][命题人:外部导入][Edit] [TestData] [同步数据] 题目 ...

  3. mysql-查询存在主表但是不存在副标的数据

    A.B两表,找出ID字段中,存在A表,但是不存在B表的数据.A表总共13w数据,去重后大约3W条数据,B表有2W条数据,且B表的ID字段有索引. 方法一 使用 not in ,容易理解,效率低  ~执 ...

  4. ADB文件及文件夹操作

    1.创建文件夹: adb shell mkdir /data/local/tmp/local多级的一次只能创建一级adb shell mkdir /data/local/tmp/local/tmp 2 ...

  5. Java笔试面试题整理第六波(修正版)

    转载至:http://blog.csdn.net/shakespeare001/article/details/51330745 作者:山代王(开心阳) 本系列整理Java相关的笔试面试知识点,其他几 ...

  6. MAC地址表、ARP缓存表以及路由表

    一:MAC地址表详解 说到MAC地址表,就不得不说一下交换机的工作原理了,因为交换机是根据MAC地址表转发数据帧的.在交换机中有一张记录着局域网主机MAC地址与交换机接口的对应关系的表,交换机就是根据 ...

  7. Node学习笔记(三)

    1.EventEmitter常用的API EventEmitter.on(event, listener) 为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数 listener. E ...

  8. Problem C: 重复子串(string)

    /* 一个性质? right集合中只有相邻的位置才会有用 那么考虑set启发式合并, 能够求出大概nlogn个有用的对 那么将这些对按照右端点排序, 查询也按照右端点排序就可以离线维护信息 然后需要维 ...

  9. 关于offsetParent

    不知道有多少人知道JavaScript中有offsetParent这么个属性. 关于offsetParent,我最开始见到他,是在<JavaScript高级程序设计(第3版)>第321页, ...

  10. ubuntu搭建php开发环境记录

    这两天自己在阿里云上面买了一个ecs,系统选的是ubuntu16.04,第一件事就是先搭环境,这次准备使用lamp组合. Apache安装 首先安装apache服务器,ubuntu下面使用apt-ge ...