T-sql 学习(8) - 深入DML

 
1. insert
1)四种格式:
a)
INSERT INTO Table_1( name, fid_fk)
VALUES('tt', 3)
into是可选的;
可以给有默认值的列指定default值:DEFAULT
可以在列名称列表中省略identity列

b)INSERT INTO Table_1
DEFAULT VALUES

c)SET IDENTITY_INSERT dbo.Table_3 ON
INSERT Table_3
SELECT * FROM Table_1
Table_3里面有一个identity列,但是,把IDENTITY_INSERT dbo.Table_3 ON之后,为什么插入还是不成

功那???

d)通过存储过程把结果集合insert进入表中
DROP TABLE tempdb.#temp
CREATE   TABLE   #temp  
(   spid   smallint,  
    ecid   smallint,  
    status   nchar(30),  
    loginname   nchar(128),  
    hostname   nchar(128),  
    blk   char(5),  
    dbname   nchar(128),  
    cmd   nchar(16),
    request_id smallint 
)  
INSERT   INTO   #temp   EXEC   sp_who  
SELECT * FROM #temp

2)错误
批命令的密封性,即:批量insert的时候,中间出现错误并不停止,只是记录@@error

3)删除重复行
如果被插入的表中,某列是UNIQUE(不可重复的),那么以insert ... select的形式插入内容的时候,

会把重复的字段删除,只保留单独的一份;

4)bulk insert批量插入
BULK INSERT table_1 FROM '**.BCP'
这时候,为了性能,触发器和约束等不会被触发

 

2. update
1)会产生Halloween问题。
2)可以使用非常复杂的逻辑控制,比如:
update  #temp
set dbname=
 case dbname
 when 'master' then 'Master'
 when 'test' then 'Test'
 else 'Other'
 end
SELECT * FROM #temp -- 可以使用select top(10) * from ...

3)可以配合cursor来进行update
DECLARE abc CURSOR LOCAL FOR
    SELECT c1, c2
    FROM dbo.Table1;
OPEN abc;
FETCH abc;
UPDATE dbo.Table1
SET c2 = c2 + d2
FROM dbo.Table2
WHERE CURRENT OF abc; -- 会造成cursor的依次fetch


3. delete
1)也可以配合cursor使用来进行删除
2)Truncate table比delete快,
 truncate table Table_1
 delete from Table_1
区别:
a)如果有一个列是identity,那么trunc之后,该列从1开始重新计数;而delete之后,该列从上次的值

继续计数。
b)因为Truncate 不是处理的某一行,也就是说,根本就不删除行,也不会触发delete 触发器,而是删

除整页,所以效率会很快;

c) 二者都可以进行rollback transaction进行数据恢复;只不过truncate的log比较少。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值