• sql学习--insert


    insert的四种插入方式

    第一种最简单的
      into 和目标列的列表是可选的
      intsert [into] tableA [(col1,col2)] values(val1,val2)

    第二种
      insert tableA values(val1,default)--cal2的在创建表时需要有默认值约束
      insert tableA default values --tableA表中所有的列都时有默认值约束才可以

    第三种
      insert [into] tableA(col1,col2)
      select val1,val2 from Stu --可以使用select查出的值作为insert值

    第四种,使用存储过程返回的结果集
      insert [into] tableA(col1,col2)
      exec sourceprocname

    insert和错误

      insert的一个有趣的特性就是批命令错误的密封性--同时插入10条数据其中一条错误,但其它9条不受那一条的影响

      如果希望一个insert插入失败时整个批命令都失败如何操作呢?--利用@@ERROR

     1 create table #famousjaycees
     2 (
     3     jc varchar(15) unique,
     4     occupation varchar(25),
     5     becamefamous int default 0,
     6     notes text null
     7 )
     8 
     9 insert #famousjaycees values('julius','miliday',0045,'took the raman')
    10 if(@@ERROR <>0) GOTO LIST
    11 insert #famousjaycees values('julius','miliday',0045,'took the raman')
    12 if(@@ERROR <>0) GOTO LIST
    13 insert #famousjaycees values('JESUS','founded',0001,'birth featured')
    14 if(@@ERROR <>0) GOTO LIST
    15 insert #famousjaycees values('John','founded',0001,'birth featured')
    16 if(@@ERROR <>0) GOTO LIST
    17 insert #famousjaycees values('Joan','founded',0001,'birth featured')
    18 if(@@ERROR <>0) GOTO LIST
    19 insert #famousjaycees values('Joe','founded',0001,'birth featured')
    20 if(@@ERROR <>0) GOTO LIST
    21 
    22 list:select * from #famousjaycees
    执行语句

    用insert命令删除重复行

      通过IGNORE_DRE_KEY设定唯一索引的办法来删除重复行。重复行将会失败并且不影响其他行

     1 create table #famousjaycees
     2 (
     3     jc varchar(15),
     4     occupation varchar(25),
     5     becamefamous int default 0,
     6     notes text null
     7 )
     8 insert #famousjaycees values('julius','miliday',0045,'took the raman')
     9 
    10 insert #famousjaycees values('julius','miliday',0045,'took the raman')
    11 
    12 insert #famousjaycees values('JESUS','founded',0001,'birth featured')
    13 
    14 insert #famousjaycees values('John','founded',0001,'birth featured')
    15 
    16 insert #famousjaycees values('Joan','founded',0001,'birth featured')
    17 
    18 insert #famousjaycees values('Joe','founded',0001,'birth featured')
    19 create table #famousjaycees2
    20 (
    21     jc varchar(15),
    22     occupation varchar(25),
    23     becamefamous int default 0,
    24     notes text null
    25 )
    26 --创建索引
    27 create unique index removedups on #famousjaycees2(jc,occupation,becamefamous)
    28 with ignore_dup_key
    29 --插入数据
    30 insert #famousjaycees2
    31 select * from #famousjaycees
    32 select * from #famousjaycees2
    实例

    注意索引中不能包括note类型的列

    insert和聚集索引

      没有聚集索引的表被称作堆表,无论表中是否还有空间,向堆表中插入的行都会被插入。如果在表中没有任何一个已有页中都没有空间了,那么久创建一个新页,然后插入该行。

    这样会在表的结尾产生一个热点(多个用户同时向表中执行insert操作,他们要竞争同一资源)。为了避免这样情况的发生的可能性,最好为自己建的表创建聚集索引。考虑使用唯一

    关键字来为新行均匀的插入到表中。避免使用自动的、连续的聚集索引键,因为他们同样会产生热点。将一个堆表变成一个有聚集索引的表时,如果使用单调增加的键为索引,那么仍然

    没有什么改善。还要避免使用不唯一的关键字作为聚集索引。在sql7.0之前,带有重复键值的行插入时会产生溢出页,降低操作速度并造成表中有碎片。从7.0版本开始,为了保证索引键

    的唯一性,在每个重复键值的后面附加上一个’uniqueifier‘(4个字节的序列号-int)。这样做自然会占用一部分处理时间,如果在开始时就使用了唯一关键字值,就不必要使用这种操作了。与所有

    的索引一样,尽量平衡个人访问数据和修改数据的需要来使用关键字值。--我个人的理解,这块应该使用带有唯一性约束或索引的列,但不能自增因为还是会使热点到最后一页,使用非自增可以平坦热点

    如果还是并发高,从数据库手段上可以使用批处理,在程序上可以引入消息队列等中间件来处理

    批量插入(Bulk Insert)

      除了标准的insert之外,T-SQL还提供了Bulk Insert命令来进行大批量的数据插入

    1 create table #famousjaycees
    2 (
    3     jc varchar(15),
    4     occupation varchar(25),
    5     becamefamous int default 0,
    6     notes text null
    7 )
    8 BULK INSERT famousjaycees from 'D:DATAfamousjaycees.bcp'

    1.批量插入和触发器

      Bulk Insert覆盖了SQL Server的触发器机制。当使用BULK INSERT 命令插入行时,insert触发器不会被触发。这是因为SQL SERVER的BCP工具尽可能的避免将插入的行写在

    事务处理日志中。也就是说,触发器根本就没有被触发的机会。然而又一个工作区,在这个工作区中使用一个假的修改可以迫使触发器触发。见Update学习文章

    2.批量插入和约束

      相对而言,说明性约束可通过使用Bulk Insert的CHECK_CONSTRAINTS选项来执行。默认情况下,除了UNIQUE约束之外,目标表的其它约束都将被忽略,所以如果想在

    大量数据操作的同时坚持这些约束,那么就要包括这个选项。但这会大幅度降低操作速度。

    3.批量插入和同一性列 

    在默认情况下,插入数据时将重新产生同一数据结构列的值。很显然,如果将数据插入到一个有外键的表时,那么后果是直接失败。

    为了防止这种情况,需要包括Bulk Insert的关键字KEEPIDENTITY

  • 相关阅读:
    CentOS7 安装Docker 18.09.5
    CentOS7 安装Jenkins 2.164.2
    Python3从零开始爬取今日头条的新闻【一、开发环境搭建】
    Win10 安装Oracle11g2、配置PL/SQL Developer11环境
    IDEA 使用Mybatis效率飞起来的必备工具:MybatisCodeHelperPro 最新破解版,亲测可用!
    Navicat Premium 12 (64位)实现连接Oracle 11 (64位)
    VMware14 安装CentOS7 实现宿主机ping通虚拟机、虚拟机ping通宿主机、虚拟机能上网且能ping通百度
    Java中util.Date通过mybatis向数据库中datetime的操作!
    Java中try-catch-finally语句中return的执行顺序总结
    java中this用法总结
  • 原文地址:https://www.cnblogs.com/cuijl/p/8529569.html
Copyright © 2020-2023  润新知