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

 create table #famousjaycees
(
jc varchar(15) unique,
occupation varchar(25),
becamefamous int default 0,
notes text null
) insert #famousjaycees values('julius','miliday',0045,'took the raman')
if(@@ERROR <>0) GOTO LIST
insert #famousjaycees values('julius','miliday',0045,'took the raman')
if(@@ERROR <>0) GOTO LIST
insert #famousjaycees values('JESUS','founded',0001,'birth featured')
if(@@ERROR <>0) GOTO LIST
insert #famousjaycees values('John','founded',0001,'birth featured')
if(@@ERROR <>0) GOTO LIST
insert #famousjaycees values('Joan','founded',0001,'birth featured')
if(@@ERROR <>0) GOTO LIST
insert #famousjaycees values('Joe','founded',0001,'birth featured')
if(@@ERROR <>0) GOTO LIST list:select * from #famousjaycees

执行语句

用insert命令删除重复行

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

 create table #famousjaycees
(
jc varchar(15),
occupation varchar(25),
becamefamous int default 0,
notes text null
)
insert #famousjaycees values('julius','miliday',0045,'took the raman') insert #famousjaycees values('julius','miliday',0045,'took the raman') insert #famousjaycees values('JESUS','founded',0001,'birth featured') insert #famousjaycees values('John','founded',0001,'birth featured') insert #famousjaycees values('Joan','founded',0001,'birth featured') insert #famousjaycees values('Joe','founded',0001,'birth featured')
create table #famousjaycees2
(
jc varchar(15),
occupation varchar(25),
becamefamous int default 0,
notes text null
)
--创建索引
create unique index removedups on #famousjaycees2(jc,occupation,becamefamous)
with ignore_dup_key
--插入数据
insert #famousjaycees2
select * from #famousjaycees
select * from #famousjaycees2

实例

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

insert和聚集索引

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

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

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

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

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

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

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

批量插入(Bulk Insert)

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

 create table #famousjaycees
(
jc varchar(15),
occupation varchar(25),
becamefamous int default 0,
notes text null
)
BULK INSERT famousjaycees from 'D:\DATA\famousjaycees.bcp'

1.批量插入和触发器

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

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

2.批量插入和约束

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

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

3.批量插入和同一性列

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

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

sql学习--insert的更多相关文章

  1. SQL学习(时间,存储过程,触发器)

    SQL学习 几个操作时间的函数 --datapart 获取时间中的年月日时分秒等部分 select DATEPART(year,current_timestamp); select DATEPART( ...

  2. sql动态insert向varchar(MAX)中写入据的问题

    sql动态insert向varchar(MAX)中写入据的问题,在写入时出现列无效.后来发现,varchar要加''两个,号才可以 SET @SQL='INSERT INTO '+@TabName+' ...

  3. SQL Server Insert操作中的锁

    原文:SQL Server Insert操作中的锁 这篇博文简单介绍一下在SQL Server中一条Insert语句中用到的锁. 准备数据 首先我们建立一张表Table_1,它有两列Id(bigint ...

  4. ORALCE PL/SQL学习笔记

    ORALCE  PL/SQL学习笔记 详情见自己电脑的备份数据资料

  5. Delphi X10.2 + FireDAC 使用 SQL 语句 INSERT

    // CREATE TABLE [tabusers]( // [id] INTEGER PRIMARY KEY AUTOINCREMENT, // [username] CHAR NOT NULL, ...

  6. TERADATA SQL学习随笔<一>

    此博客内容简介及目录 http://www.cnblogs.com/weibaar/p/6644261.html 最近在TERADATA环境学习SQL.在这里记录一下学习中查过的知识点,作为备案. 目 ...

  7. sql在insert时判断有无唯一性冲突

    sql在insert时判断有无唯一性冲突,存在相同主键或唯一索引,则不创建 INSERT INTO table(field1, field2, fieldn) SELECT 'field1', 'fi ...

  8. Mybatis执行sql(insert、update、delete)返回值问题

    数据库:Mysql 在使用mybatis的过程中对执行sql的返回值产生疑问,顺手记录一下. 结论: insert:   插入n条记录,返回影响行数n.(n>=1,n为0时实际为插入失败) up ...

  9. (013)每日SQL学习:日期的各种计算

    1.确定两个日期之间的工作日天数 --确定两个日期之间的工作日天数with x0 as (select to_date('2018-01-01','yyyy-mm-dd') as 日期 from du ...

随机推荐

  1. How To:配置Openfiler磁盘

    目录 1.系统登陆 2.启用iSCSI Target服务 3.初始化卷组 4.映射LUN 5.查看状态 1.系统登陆 Openfiler系统安装完毕之后,使用提示的地址登陆:https://172.1 ...

  2. codevs1961 躲避大龙

    1961 躲避大龙  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 你早上起来,慢悠悠地来到学校门口, ...

  3. jQuery匹配id 批量修改css属性

    <ul id="foreignCurrencyTree_1_ul"> <li id="foreignCurrencyTree_11_li"&g ...

  4. 2.2 为什么要使用Shell脚本

        使用脚本编程语言的好处是,它们多半运行在比编译型语言还高的层级,能够轻易处理文件与目录之类的对象.缺点是:它们的效率通常不如编译型语言.不过权衡之下,通常使用脚本编程还是值得的:花一个小时写成 ...

  5. 为什么有些图像在显示前要除以255?(zhuan)

    imshow是用来显示图片的,如 >> I = imread('moon.tif'); >> figure,imshow(I); 而有时为了数据处理,要把读取的图片信息转化为更 ...

  6. 几个有用的shell命令

    1.!$ 是一个特殊的环境变量,它代表了上一个命令的最后一个字符串.如:你可能会这样: $mkdir mydir$mv mydir yourdir$cd yourdir 可以改成: $mkdir my ...

  7. [HDU3518]Boring counting(后缀数组)

    传送门 求出现超过1次的不重叠子串的个数 根据论文中的方法. 枚举子串的长度 k. 用 k 给 height 数组分组,每一组求解,看看当前组的位置最靠后的后缀和位置最靠前的后缀所差个数是否大于长度, ...

  8. java debug jdk(转载)

    Debug info unavailable 解决之道 从事Java的小伙伴们估计都有断点代码的习惯,可以很方便的查看运行期代码中一些变量的值. 但是JDK中有些类你会发现是无法断点的,即使你在IDE ...

  9. Spring MVC中<mvc:annotation-driven />和<context:annotation-config />的区别分析

    个人最简单的使用理解: <mvc:annotation-driven />是管理静态资源的,比如静态页面,返回JSON这些. <context:annotation-config / ...

  10. Spring MVC-控制器(Controller)-属性方法名称解析器(Properties Method Name Resolver )示例(转载实践)

    以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_propertiesmethodnameresolver.htm 说明:示例基于S ...