`
mwei
  • 浏览: 123921 次
  • 性别: Icon_minigender_1
  • 来自: 抽象空间
社区版块
存档分类
最新评论

向DB表中插入100W条记录

    博客分类:
  • db
阅读更多
有机会出笔试题的时候,下面是备用方案。
题:向数据库中插入100W条记录,表自定义,数据可重复。
delimiter $$
drop procedure if exists insertRecords $$
create procedure insertRecords(num int)
begin
 declare mi tinyint default 0;
 drop table if exists recursive;
 create table recursive(id int auto_increment, name varchar(20),primary key(id));
 insert into recursive(name) values('anna');
 while(power(2,mi)<num) do
  set mi=mi+1;
  insert into recursive(name) select name from recursive;
 end while;
 delete from recursive where id > num;
end
$$ delimiter ;

MySQL 存储过程是从 MySQL 5.0 开始增加的新功能。使用delimiter $$ 来定义语句结束符,创建完成后,还原;因为MySQL默认以";"为分隔符,过程体的每一句都被MySQL以存储过程编译,则编译过程会报错。drop procedure if exists...在此已经执行了。
上述代码的第13行,可以使用带参数的limit来改进,如下,
delimiter $$
drop procedure if exists insertRecords $$
create procedure insertRecords(num int)
begin
 declare mi tinyint default 1;
 declare more int default 0;
 drop table if exists recursive;
 create table recursive(id int auto_increment, name varchar(20),primary key(id));
 insert into recursive(name) values('anna');
 while(power(2,mi)<num) do
  set mi=mi+1;
  insert into recursive(name) select name from recursive;
 end while;
 set more=num-power(2,(mi-1));
 set @stmt='insert into recursive(name) select name from recursive limit ?';
 prepare newSql from @stmt;
 set @arg=more;
 execute newSql using @arg;
 deallocate prepare newSql;
end
$$ delimiter ;

To deallocate a prepared statement produced with PREPARE, use a DEALLOCATE PREPARE statement that refers to the prepared statement name. Attempting to execute a prepared statement after deallocating it results in an error.看得懂,不会翻译...执行存储过程后才开始关于表的DDL&DML。
call insertRecords(1000000);

最后查看记录条数。
select count(id) num from recursive;


--------下面给出Oracle版-------------------------------
先创建序列用于自增,如下。
create sequence auto_increment;

然后创建表,blabla...
create table recursive(id number(10) primary key, name varchar2(20));

接着整个触发器,作用:向表中插入数据时实现自动自增功能。
create or replace trigger insert_recursive_trigger
before insert on recursive 
for each row
begin 
 select auto_increment.nextval into :new.id  from dual; 
end;
/

插入一条记录,以备后用。
insert into recursive(name) values('anna');

后面写个存储过程,用于插入数据,下面13行后面的 :1是占位符 。
create or replace procedure insertRecords(num number)
is 
 mi number(2) default 1;
 more number(10) default 0;
 dml_insert varchar2(100);
begin
 dml_insert :='insert into recursive(name) select name from recursive';
 while(power(2,mi)<num) loop
  mi :=mi+1;
  execute immediate dml_insert ;
 end loop;
 more :=num-power(2,(mi-1));
 dml_insert :='insert into recursive(name) select name from recursive where  rownum<=:1';
 execute immediate dml_insert using more;
end ;
/

最后测试下,只用了10w条,有点慢,是由于用了触发器的缘故。
exec insertRecords(100000); 
select count(id) num from recursive;
select count(distinct(id)) from recursive;

之前也是把所有Orable语句集成到insertRecords存储过程里,发现有关于execute immediate的权限问题,没深入探索,就拆开了。感兴趣的童鞋给加个MS SqlServer(刚卸载不久,暂不想再装)版的。

1.若总分为10分,写出 insert into .. select ..即可得5分。
2.若之用for循环100w次插入数据,得3分。

[注]:程序实用性不大,主要考察能力。
         上述代码通过了MySql5.0、Oracle10g_r1编译和运行。


0
0
分享到:
评论

相关推荐

    db2一些常用命令

    例如,向 tt 表中插入两行数据。 ### 13. 创建表的副本 - **创建表的副本**: - `CREATE TABLE &lt;新表名&gt; AS SELECT * FROM &lt;源表名&gt;`:创建一个表的副本。DB2 不支持直接使用这种方式创建表副本,但可以通过 `...

    mysql百万级测试数据下载 300W条

    在这个场景中,它包含了300万条记录,这对于测试数据库性能、查询优化、并发处理能力等提供了充足的数据基础。 1. **数据库性能测试**:百万级别的数据量可以模拟实际生产环境,测试数据库在高负载下的性能。这包括...

    使用DB2look重新创建优化器访问计划(9)

    例如,一个包含一百万行记录的表在运行 RUNSTATS 之后插入了额外的记录。表的 CARD(卡片计数,即记录数量)显示为 1,100,000,但主键索引的 FIRSTKEYCARD 显示为 1,110,000。这种不一致性可能导致优化器做出错误的...

    DB2 SQL 消息

    - **SQL0040N:** 表示表中没有满足条件的行。 - **SQL0041N:** 表示没有为表定义索引。 - **SQL0051N:** 表示SQL目标值溢出。 - **SQL0053W:** 表示未执行SQL语句。 - **SQL0055N:** 表示源表为空。 - **SQL0056N:**...

    Informix V12.10--DB-Access User's Guide-72.pdf

    - 用户可以使用`SQL `-w 和`53`-w等命令执行SQL查询,如创建表、插入数据、更新记录和删除记录等。 - 特殊的Informix扩展,如SPL(SQL过程语言),提供更高级的功能,如用户自定义函数和存储过程。 4. **示例和...

    MySQL数据库30W测试数据.rar

    而 "test_db-master" 可能是一个包含数据库结构、表定义和初始数据的文件夹,或者是一个压缩的SQL文件,用于一次性导入到MySQL数据库中。 导入大量数据时,可以采用以下几种常见方法: 1. **使用SQL命令行工具**:...

    QTP插入各种数据库检查点

    标题与描述概述的知识点是关于如何在QTP(QuickTest Professional)中插入各种数据库检查点,这涉及到在自动化测试脚本中验证数据的正确性,确保应用程序与后端数据库交互时的功能正常。以下是对该主题的详细解释: ...

    在Android中创建和使用数据库

    // 插入一条新记录 public long insertTitle(String isbn, String title, String publisher) { ContentValues initialValues = new ContentValues(); initialValues.put(KEY_ISBN, isbn); initialValues.put(KEY_...

    ORM library for golang

    `Rows`方法返回满足条件的所有记录,而`Row`方法则只返回第一条记录。 #### 结论 `zhgo/db`是一个强大且易于使用的Golang ORM库,它极大地简化了与关系型数据库交互的过程。无论是简单的CRUD操作还是更复杂的...

    数据系统概论复习题及答案.doc

    14. 关键字:在关系模式W中,根据给定的数据依赖,{(T,S)}能够唯一确定一条记录,因此它是关键字。 15. 最高范式(NF):如果关系模式的所有属性都是主属性,那么它至少达到了3NF,因为没有非主属性,从而避免了...

    Java_DB_Book

    此外,事务管理也是数据库操作中不可或缺的一部分,特别是在涉及多条记录修改时,以确保数据的一致性和完整性。 总的来说,“Java_DB_Book”项目揭示了Java语言如何与数据库进行深度集成,提供了从数据库读取、写入...

    Zend Framework教程之Zend_Db_Table_Row用法实例分析

    `Zend_Db_Table_Row`还支持其他操作,比如插入新记录(通过`insert()`方法创建新行并返回新行对象)、删除记录(使用`delete()`方法)以及检查数据是否已更改(`isModified()`方法)。此外,你可以通过`...

    sqlite命令

    - **插入新记录**:使用`INSERT`语句向表中添加新记录。 - 示例:`INSERT INTO wj2 (userid, usrname, password) VALUES (NULL, 'w', 'w');` - **创建新表**:使用`CREATE TABLE`语句创建一个新的表,并定义表的...

    上海市高等教育自学考试数据库系统原理实践.pdf

    8. 在应用中建立主窗口w_main,主窗口中应包含四个数据窗口控件、八个命令按钮控件、一个静态文本控件和一个单行编辑器控件。 9. 在应用各对象中书写脚本,使该应用具有浏览、插入、修改和删除等功能。 本资源摘要...

    利用存储过程生成报表

    这条语句的作用是将`DB01.iemis.temp_mt_code`表中的所有数据复制到新表`DB031.iemis.temp_mt_code`中。 - `SELECT * FROM iemt03h; SELECT * FROM iemt03d1a;` 这两条语句分别用于查询表`iemt03h`和`iemt03d1a...

    数据库原理与应用模拟试卷1.pdf

    10. 插入数据到S表中,应使用INSERT INTO语句,并确保数值类型的数据不带引号。 11. 关系模式W的关键字是(T,S),因为它能唯一确定一行数据。 12. 函数依赖集下的无损连接分解,分解III是无损的。 13. “为哪些...

    数据库试题总结 ppt

    - 右外连接会保留右表(S)的所有记录,即使在左表(R)中没有匹配项。 9. SQL语句创建表SC的插入行规则: - 可以插入的行:B - 只有B选项满足所有非空约束,S#和C#都不能为NULL。 10. SQL查询条件: - 正确...

Global site tag (gtag.js) - Google Analytics