龙空技术网

数据库大师成长日记:如何在SQL中正确使用临时表

网云技术 569

前言:

现在看官们对“sqlserver自动编号”都比较关切,同学们都需要剖析一些“sqlserver自动编号”的相关文章。那么小编同时在网摘上搜集了一些对于“sqlserver自动编号””的相关内容,希望大家能喜欢,小伙伴们快快来了解一下吧!

经常写数据库SQL脚本的朋友,对数据库的本地表(table)肯定不会陌生,我们的数据,大多都是通过表进行存储。除了本地表之外,功能比较类似的还包括临时表、表变量、公用表、表类型、内存表等,她们的含义和用途各不相同。今天我们就好好说说SQLServer中的临时表。

临时表的特点、分类及区别

临时表与永久表相似,但临时表存储在tempdb中,当不再使用时会自动删除。临时表利用了数据库临时表空间,由数据库系统自动进行维护,因此节省了表空间。并且由于临时表空间一般利用虚拟内存,大大减少了硬盘的I/O次数,因此也提高了系统效率。临时表在事务完毕或会话完毕数据自动清空,不必记得用完后删除数据。

临时表有两种类型:本地和全局。它们在名称、可见性以及可用性上有区别。

本地临时表仅在当前会话中可见,名称前面有一个编号符 #。它们仅对当前的用户连接是可见的,当实例断开连接时被删除。本地临时表根据数据库连接独立,只有创建本地临时表的数据库连接有表的访问权限,其它连接不能访问该表。不同的数据库连接中,创建的本地临时表虽然“名字”相同,但是这些表之间相互并不存在任何关系。全局临时表在所有会话中都可见,名称前面有两个编号符 ##。通常情况下,只要创建全局临时表的连接断开,全局临时表即被除去。

除非使用 Drop Table语句显式除去临时表,否则临时表将在退出其作用域时由系统自动删除。临时表不存储在当前数据库内,而是存储在系统数据库 tempdb 内。

当创建本地或全局临时表时,CREATE TABLE 语法支持除 FOREIGN KEY 约束以外的其它所有约束定义。如果在临时表中指定 FOREIGN KEY 约束,该语句将返回警告信息,指出此约束已被忽略,表仍会创建,但不具有 FOREIGN KEY 约束。在 FOREIGN KEY 约束中不能引用临时表。

当需要在临时表上显式地创建索引时,或多个存储过程或函数需要使用表值时,临时表很有用。

本地临时表的应用

本地临时表的名称以单个数字符号# 开头,仅对当前的用户连接(也就是创建本地临时表的数据库连接)是可见的,当用户从SQL Server实例断开连接时被删除。

1、创建本地临时表。

保险起见,创建之前先要删除,因临时表存在在数据库tempdb中,所以删除时要指定归属的数据库。创建的过程与创建表也非常类似。通过使用select into自动生成也是可以的。

if object_id('tempdb..#MyTable') is not null begin drop table #MyTable;end;create table #MyTable( FSerial int identity(1,1) not null, FName nvarchar(100) null, FAge smallint null);

2、数据的插入和查询。

临时表插入数据与插入普通表类似,查询亦类似。

insert into #MyTable(FName,FAge)values('张三',20),('李四',22),('王五',30),('马六',18);select * from #MyTable;

3、临时表的删除。

如果您不通过SQL脚本删除,系统也会在断掉连接时自动删除。我们最好养成好习惯,用完就删除,删除的方法其实在第一段已经说明了,保险起见,最好先检查下是否存在再行删除。

if object_id('tempdb..#MyTable') is not null begin drop table #MyTable;end;
全局临时表的应用

全局临时表的名称以两个数字符号 ##开头,创建后对任何数据库连接都是可见的,当所有引用该表的数据库连接从SQL Server断开时被删除。

全局临时表的创建、插入、查询、删除与本地临时表都是类似的,这里不在赘述。

希望对您有所帮助!

标签: #sqlserver自动编号