sql学习--update
两种修改形式
第一种:静态插入
update #famousjaycess set jc='johnny cash',occupation='Singer/songwriter',becamefamous=1955,notes='began career selling ...balabala'
where jc='johnny ca'
第二种:
--注意别名和on后边的表连接不要写错
update f set jc='johnny cash',occupation='Singer/songwriter',becamefamous=1955,notes='began career selling ...balabala'
from #famousjaycess f
join #samefamousjaycess s on (f.becamefamous=s.becamefamous)
Halloween的问题
在修改过程中,将被修改行在将被修改的行的列表中移动,会引起多次被修改,这种情况被称为Halloween问题。
好在在问题发生时sql会认识到这个问题,以及那种类型的错误,然后采取措施。
将主关键字和触发器结合起来,看上去好像会增加问题的可能性,毕竟触发器认为数据时被修改的;而实际情况是sqlserver的触发器每个语句只会执行一次,而不是每行都被触发一次
并且触发器只在数据修改之前或之后进行存取,并不是在过程中进行存取。看上去仿佛并没有什么用,但其实并不是。触发器的代码并不会和触发他们的insert、delete、update命令一起编译
执行计划。而是独立的编译并放入缓冲区,所以无论触发它的命令是什么,都可以有效的重复使用。DML语句的执行计划分支给它激发的所有触发器,这种操作在执行计划结束之前进行的。如果
是结束后就无法完成了。
注意这种情况并不适用于约束。每个表的约束都是直接加入DML的执行计划中。
Update和Case
通过Update使用CASE表达式,可以对表进行比较复杂的操作,但需要一定的编程逻辑。
update titles
set price=price*case title when 'business' then 1.5
when 'mod_cook' then .8
when 'trad_cook' then .6
when 'paycholoy' then .5
when 'popular_comp' then 1.8
else .75
end
用Update做检测约束
如果使用Bulk Insert或者其他大批量的加载数据的工具来对有insert触发器的表进行追加数据,那么会发现触发器是能被触发。而且,即使Bulk Insert不妨碍约束,也会是操作变得非常慢。
如果在载入时忽略约束,那么就快多了。有一个选项可以在载入数据之后人工的检查约束和触发器。这就要求对于每一个约束和触发器都有单独的代码,并且做大量的防止出错的操作。
另外一种方式就是在数据载入后立刻执行一个假的update操作。这个假的修改只是简单的将列值置为其本身的值。这样就会触发触发器并对约束进行检查。如果其中包含错误的行那么就会update失败。
create table famousjaycess(
jc varchar(15) check(left(jc,3)<>'joe'),
occupation varchar(25),
becamefamous int default 0,
notes text null
) bulk insert famousjaycess from 'D:\DB\famousjaycess.bcp' update famousjaycess set
jc=jc,
occupation=occupation,
becamefamous=becamefamous,
notes=notes
限制受update影响的行的数目
用select top n的语句可以限制受影响行的数目。select语句作为导出表嵌入在update的from子句中,并与目标表进行连接
update a
set a.contract=0 from authors a
join(select top 5 au_id from authors order by au_id) u
on a.au_id=u.au_id
最新文章
- Intellij IDEA Java web 项目搭建
- Loadrunne实现多个场景运行
- Windows安装Python图像处理库:PIL模块
- ubuntu下启动和关闭tomcat的简单方法
- jquery.validate.unobtrusive
- js中:Date.utc()方法与getTime()方法返回值不相等的原因
- shell快捷键
- Kali Linux安装中文输入法全纪录
- CentOS系统下安装python3+Django
- UVA 508 Morse Mismatches JAVA
- C++ 函数模板重载
- web前端学习历程--排序
- 解决从本地文件系统上传到HDFS时的权限问题
- 4步win7下简单FTP服务器搭建(试验成功)
- response.sendRedirect传递参数和转向
- Python学习笔记_week2_列表、元组、字典、字符串、文件、i编码
- 牛腩学用MUI做手机APP
- 关于Unity中如何判断一个动画播放结束
- const与预处理宏#define的区别
- java中常见的异常(转)