精华内容
下载资源
问答
  • 从上述结果中可以看出,利用上面的存储过程添加100万条随机用户数据是非常耗时的,用了几乎一个小时的时间。下面是优化后的存储过程: DROP PROCEDURE IF EXISTS add_user_optimizition; DELIMITER // ...

    1.创建用户表

    CREATE TABLE user100w(
      id INT NOT NULL AUTO_INCREMENT,
      first_name VARCHAR(10) NOT NULL,
      last_name VARCHAR(10) NOT NULL,
      sex VARCHAR(5) NOT NULL,
      score INT NOT NULL,
      copy_id INT NOT NULL,
      PRIMARY KEY (`id`)
    );

    2.创建存储过程

    
    DROP PROCEDURE IF EXISTS add_user;  
    DELIMITER //
        create PROCEDURE add_user(in num INT)
        BEGIN
            DECLARE rowid INT DEFAULT 0;
            DECLARE firstname CHAR(1);
            DECLARE name1 CHAR(1);
            DECLARE name2 CHAR(1);
            DECLARE lastname VARCHAR(3) DEFAULT '';
            DECLARE sex CHAR(1);
            DECLARE score CHAR(2);
            WHILE rowid < num DO
            SET firstname = SUBSTRING('赵钱孙李周吴郑王林杨柳刘孙陈江阮侯邹高彭徐',FLOOR(1+21*RAND()),1); 
            SET name1 = SUBSTRING('一二三四五六七八九十甲乙丙丁静景京晶名明铭敏闵民军君俊骏天田甜兲恬益依成城诚立莉力黎励',ROUND(1+43*RAND()),1); 
            SET name2 = SUBSTRING('一二三四五六七八九十甲乙丙丁静景京晶名明铭敏闵民军君俊骏天田甜兲恬益依成城诚立莉力黎励',ROUND(1+43*RAND()),1); 
            SET sex=FLOOR(0 + (RAND() * 2));
            SET score= FLOOR(40 + (RAND() *60));
            SET rowid = rowid + 1;
            IF ROUND(RAND())=0 THEN 
            SET lastname =name1;
            END IF;
            IF ROUND(RAND())=1 THEN
            SET lastname = CONCAT(name1,name2);
            END IF;
            insert INTO user100w (first_name,last_name,sex,score,copy_id) VALUES (firstname,lastname,sex,score,rowid);  
            END WHILE;
        END //
    DELIMITER ;

    3.调用存储过程添加随机用户数据,比如随机插入1000000条数据:

    call add_user(1000000);

    执行结果如下:
    这里写图片描述

    从上述结果中可以看出,利用上面的存储过程添加100万条随机用户数据是非常耗时的,用了几乎一个小时的时间。下面是优化后的存储过程:

    DROP PROCEDURE IF EXISTS add_user_optimizition;  
    DELIMITER //
        create PROCEDURE add_user_optimizition(in num INT)
        BEGIN
            DECLARE rowid INT DEFAULT 0;
            DECLARE firstname CHAR(1);
            DECLARE name1 CHAR(1);
            DECLARE name2 CHAR(1);
            DECLARE lastname VARCHAR(3) DEFAULT '';
            DECLARE sex CHAR(1);
            DECLARE score CHAR(2);
            SET @exedata = "";
            WHILE rowid < num DO
                SET firstname = SUBSTRING('赵钱孙李周吴郑王林杨柳刘孙陈江阮侯邹高彭徐',FLOOR(1+21*RAND()),1); 
                SET name1 = SUBSTRING('一二三四五六七八九十甲乙丙丁静景京晶名明铭敏闵民军君俊骏天田甜兲恬益依成城诚立莉力黎励',ROUND(1+43*RAND()),1); 
                SET name2 = SUBSTRING('一二三四五六七八九十甲乙丙丁静景京晶名明铭敏闵民军君俊骏天田甜兲恬益依成城诚立莉力黎励',ROUND(1+43*RAND()),1); 
                SET sex=FLOOR(0 + (RAND() * 2));
                SET score= FLOOR(40 + (RAND() *60));
                SET rowid = rowid + 1;
                IF ROUND(RAND())=0 THEN 
                SET lastname =name1;
                END IF;
                IF ROUND(RAND())=1 THEN
                SET lastname = CONCAT(name1,name2);
                END IF;
                IF length(@exedata)>0 THEN
                SET @exedata = CONCAT(@exedata,',');
                END IF;
                SET @exedata=concat(@exedata,"('",firstname,"','",lastname,"','",sex,"','",score,"','",rowid,"')");
                IF rowid%1000=0
                THEN 
                    SET @exesql =concat("insert into user100w_optimizition(first_name,last_name,sex,score,copy_id) values ", @exedata);
                    prepare stmt from @exesql;
                    execute stmt;
                    DEALLOCATE prepare stmt;
                    SET @exedata = "";
                END IF;
            END WHILE;
            IF length(@exedata)>0 
            THEN
                SET @exesql =concat("insert into user100w_optimizition(first_name,last_name,sex,score,copy_id) values ", @exedata);
                prepare stmt from @exesql;
                execute stmt;
                DEALLOCATE prepare stmt;
            END IF; 
        END //
    DELIMITER ;

    创建一个与上述用户表同样的表结构如下:

    CREATE TABLE user100w_optimizition(
      id INT NOT NULL AUTO_INCREMENT,
      first_name VARCHAR(10) NOT NULL,
      last_name VARCHAR(10) NOT NULL,
      sex VARCHAR(5) NOT NULL,
      score INT NOT NULL,
      copy_id INT NOT NULL,
      PRIMARY KEY (`id`)
    );

    执行优化后的存储过程:

     call add_user_optimizition(1000001);

    执行结果如下:
    这里写图片描述

    优化后的结果可以看到,百万条数据只需要50秒的执行时间,优化作用十分显著。对比优化前后的存储过程,不难发现我这里只是修改了一下sql的结构,把多条sql合并成一条执行。从这个案例中,我们总结出:如果一次性对同一个表插入多条数据,将insert语句拼成一条的效率会更高。

    展开全文
  • 如果某一操作包含大量的T-SQL语句代码,分别被多次执行,那么存储过程要比批处理的执行速度快得多。因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的...

          如果某一操作包含大量的T-SQL语句代码,分别被多次执行,那么存储过程要比批处理的执行速度快得多。因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划。而批处理的T-SQL语句每次运行都需要预编译和优化,所以速度就要慢一些。


    如题:



     


    表结构和基础数据如图所示:

    新建存储过程:insertOrUpdate

      /*建立存储过程*/
      create procedure insertOrUpdate
      @BookName varchar (50),
      @Price float,
      @Publish varchar (50),
      @id int,
      @Storage int,
      @returnValue int output
      as
      
      /*判断该id号的书是否已经存在*/
      if exists (select * from Book where id=@id)  
      begin
      /*更新数据*/
      update Book set BookName=@BookName ,Price=@Price where id=@id
      /*设置返回值*/
      set @returnValue=0
      end 
      
      else 
      begin 
      /*插入*/
      insert into Book values(@BookName,@Price,@Publish,@id,@Storage)
      set @returnValue=1
      end

    执行操作:

    	declare @returnValue int
    	exec insertOrUpdate '123',99.0,'真贵出版社',13,3,@returnValue output
    	select @returnValue

    数据库中便会根据相应的操作进行更新或者插入,并返回值0或1


    展开全文
  • 存储过程进行添加与修改数据

    万次阅读 2017-04-25 11:34:45
    --创建添加与修改的存储过程 --省 create --首先定义输入与输出参数 --例:@uID nvarchar(50) 输入 @i int output 输出 --然后定义临时存储变量,用于存储数据库查询出来的数据(此步可省) --接着进行判断 --...



    --创建添加与修改的存储过程
    --省   create
    --首先定义输入与输出参数
    --例:@uID nvarchar(50)  输入   @i int output 输出
    --然后定义临时存储变量,用于存储数据库查询出来的数据(此步可省)
    --接着进行判断
    --例:if Exists(select * from [user] where uID=@uID) 根据ID进行查询
    --  如果有数据,就进行修改操作


    --  以下步骤可以省略  直接进行Update操作   此步操作避免多余的Update
    -- select @Name=uName,@pwd=uPwd(给临时变量赋值) from [user] where uID=@uID
    -- if((@uName=@Name) and (@uPwd=@pwd))判断用户输入与数据库的值是否一样
    --  如果一样就不进行修改直接打印输出
    --  否则就进行Update操作并打印输出
    --  以上步骤可以省略  直接进行Update操作


    --    否则就进行添加并打印输出




    --使用存储过程进行添加和修改
    if object_id('proc_InsertORUpdate','p') is not null 
    drop proc  proc_InsertORUpdate
    go
    create proc proc_InsertORUpdate
    @uID nvarchar(50),
    @uName  nvarchar(50),
    @uPwd  nvarchar(50),
    @i int output
    as
    declare 
    @Name  nvarchar(50),
    @pwd  nvarchar(50)
    --根据ID进行查询,如果有数据进入IF 
    if Exists(select * from [user] where uID=@uID)
    begin 
    --根据ID进行查询,有数据给变量赋值
    select @Name=uName,@pwd=uPwd from [user] where uID=@uID
    --如果传进来的数据跟数据库查询出来的数据相同,就直接打印
    if((@uName=@Name) and (@uPwd=@pwd))
    begin 
    set @i=0
    end 
    else
    begin 
    --否则就进行修改
    update [user] set uName=@uName,uPwd=@uPwd where uID=@uID
    set @i=2
    end 
    end
    else--否则就进行添加
    begin
    insert into [user](uID,uName,uPwd)values(@uID,@uName,@uPwd)
    set @i=1
    end



    展开全文
  • 有时候,我们做做mysql实验的时候想批量创建随机的字符串,一条一条添加肯定很麻烦,所以这里利用mysql存储过程函数来实现这个功能: DROP PROCEDURE IF EXISTS add_film; DELIMITER // CREATE PROCEDURE add_...

    有时候,我们做做mysql实验的时候想批量创建随机的字符串,一条一条添加肯定很麻烦,所以这里利用mysql存储过程函数来实现这个功能:

    DROP PROCEDURE IF EXISTS add_film; 
    DELIMITER //
        CREATE PROCEDURE add_film(IN num INT)
        BEGIN
            DECLARE filmid INT DEFAULT 0;
            DECLARE filmtitle VARCHAR(100) DEFAULT '';
            DECLARE des VARCHAR(255) DEFAULT '';
            WHILE filmid < num DO
            SET filmtitle = SUBSTRING('acvqweyuiolmploiuyqwc',FLOOR(1+21*RAND())); 
            SET des = SUBSTRING('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',FLOOR(1+62*RAND())); 
            SET filmid = filmid + 1;
            INSERT INTO film_text (film_id,title,description) VALUES (filmid,filmtitle,des);  
            END WHILE;
        END //
    DELIMITER ;

    说明:

    1floor函数:取数值的整数部分

    2rand函数:生成0-1的随机数,如0.5

    3substring(str,len),在str字符串中截取长度为len的字符串

    上面上面存储过程之后,再使用call(100)来调用存储过程实现生成100行的随机字符串

    call add_file(100)

    上面可以看到,我创建的表的字段有file_id、title和description字段

    使用

    SHOW PROCEDURE STATUS命令查看上面存储函数的执行状态

    展开全文
  • delimiter $ create procedure pro(in n int) begin declare num001 int; set num001 = 1; while n - num001 >= 0 do insert into users (NAME,PASSWORD,NICK_NAME,REAL_NAME,LAST_LOGIN_TIME,SEX) ...
  • 调用存储过程,向内存表中插入数据: CALL add_gu_memory(1000000) 这一个过程比较缓慢,而且可能会报空间不足: 我是在本地测,空间比较充足,那么就是配置文件 my.ini 配置空间太小: tmp_table_size = ...
  • create or replace procedure test is begin for i in 1 ..100 loop insert into 表名(id,name) values(i, sysdate); end loop; end test; BEGIN test(); END; drop procedure test
  • 示例: 向user表中插入一千万条数据,其中user_id11位手机号随机,可以重复;...-- 如果该名字存储过程已存在,则删除 DROP PROCEDURE IF EXISTS proc_initData1; -- 创建 CREATE PROCEDURE proc_initData1 ( ) BEGI...
  • 自动生成存储过程抽取数据

    千次阅读 2020-08-03 17:52:33
    在工作中我们常常需要从各种业务系统抽取数据到自己的数据库做各种处理与计算,做数据挖掘与分析等等,但是抽取过程中,insert()后面我们最好是需要指定具体的字段的,不然的话原库数据库表结构一变我们就凉凉,要么...
  • 通过这个实例,学习存储过程的使用,涉及到存储过程循环体。 关于循环体的实现方式总结为3种: 实现方式一(while ..循环条件..do..循环体..end while): DELIMITER $$ CREATE PROCEDURE insert_many_i_data() ...
  • 所以打算利用存储过程传入list集合对象,提升效率。 2、步骤: (1)数据库创建一个对象,对象字段和要插入的实体类属性对应 create or replace type linkquery as object(  fid VARCHAR2(32),  fbustype ...
  • --判断新表中是否存在此条循环出来的数据 set @count = (select isnull(count(*),0) from dbo.Sm_CheckInout where UserID=@people and resultType=@type and ClockTime=@datetime ) if(@count = 0) begin...
  • 存储过程很方便,就像写shell脚本一样,可以帮我们把重复的命令总结成一个脚本,不用自己每次都做重复的操作, sql是不可以拼接表名的,有时候写存储过程想把表名作为...例2:以及通过存储过程自动插入批量测试数据
  • mysql 创建存储过程 循环添加记录

    千次阅读 2016-10-14 12:10:36
    mysql 创建存储过程 循环添加记录 先创建,然后调用 -- 创建存储过程 DELIMITER;// create procedure myproc() begin declare num int; set num=1; while num insert into t_calendar_hour(hourlist) values...
  • mysql使用存储过程循环插入数据

    千次阅读 2017-05-07 05:25:15
    所以自己查了查网上,写了个存储过程。 逻辑:把t_memberId表里面存在的id查出来并插入到t_member_account //删除存储过程DROP PROCEDURE IF EXISTS proc_buildata; //存储语句 tudou@Gyyx CREATE PROCEDURE proc_...
  • sqlserver通过存储过程添加登陆用户

    千次阅读 2010-06-21 20:32:00
     为 Microsoft SQL Server 登录或 Microsoft Windows NT 用户或组在当前数据库中添加一个安全帐户,并使其能够被授予在数据库中执行活动的权限。     语法:   sp_grantdbaccess [@loginame =] '...
  • 创建存储过程和触发器   1、建表 首先先建两张表(users表和number表),具体设计如下图:   2、存储过程 写一个存储过程,往users表中插入数据,创建过程如下:   代码如下:
  • 如何利用区块链技术进行数据存储?

    千次阅读 2019-01-21 17:15:56
    在大型、集中式的数据中心中存储数据,往往存在性能、可用性和可扩展性等方面问题,同时也会带来较高的资本或运营支出。而且,集中存储数据也极易受到复杂网络攻击。出于这些原因,企业开始寻求去中心化数据存储的...
  • unity中利用Dictionary存储数据

    千次阅读 2015-04-28 20:54:46
    * Dictionary:Dictionary:字典:属于泛型类容器,用来存储一对键值对 * 1.命名空间:System.Collections.Generic * 2.构造方法:Dictionary dic=new Dictionary(); * 3.常用属性:Count:返回字典中键值对的数目 ...
  • 当一个应用程序在Android中安装后,我们在使用应用的过程中会产生很多的数据,应用都有自己的数据,那么我们应该如何存储数据呢?数据存储方式Android 的数据存储有5种方式:1. SharedPreferences存储数据  ...
  • 各位高手您们好,我最近接手公司里一个比较棘手的问题,关于如何利用MySQL存储数据量的问题,主要是数据库中的两张历史数据表,一张模拟量历史数据和一张开关量历史数据表,这两张表字段设计的很简单(OrderNo,...
  • 存储过程详解

    千次阅读 2017-05-01 09:53:54
    什么是存储过程存储过程可以说是一个记录集吧,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候...
  • 存储过程的主要功能是把数组中满足条件的数据插入到数据库中,不满足条件的以字符串返回。 接下来就是java代码了,我这里用的是jdbc获取的connection,不存在网上所说的获取不到oracle的connection等错误信息 ...
  • 存储过程一般用于处理比较复杂的任务,基础ms这个平台,可以大大降低耗时,其编译机制也提高了数据库执行速度。 当然在系统控制方便方面,例如当系统进行调整时,这是只需要将后台存储过程进行更改,而不需要更改...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 504,610
精华内容 201,844
关键字:

利用存储过程添加数据