[size=large]虽然SQL92, 99, 2003, 2008标准都有推出,但并不是所有商家严格按照标准行事。痛苦的是使用和应用不同数据库的DBA和开发人员。
这里以几种主流数据库为例,分别介绍一下临时表的使用:
1. PostgreSQL (以9.x为例)
使用的是比较标准的语法:
create [global | local] temp table t ( id int primary key) on commit delete | preserve rows
其中,global和local是摆设,一样的效果。都是会话级别的。当前会话退出,表即删除。
可以创建与当前模式相同的表名,即可以创建同名的表t,drop table t时,会先删除临时表。如下例所示:
iihero=# create global temp table t(id int primary key) on commit delete rows;
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "t_pkey" for table "t"
CREATE TABLE
iihero=# insert into t values(1);
INSERT 0 1
iihero=# select * from t;
id
----
(0 rows)
</span>
iihero=# begin;
BEGIN
iihero=# insert into t values(1);
INSERT 0 1
iihero=# select * from t;
id
----
1
(1 row)
iihero=# commit;
COMMIT
iihero=# select * from t;
id
----
(0 rows)
</span>
2. DB2 9.x
1). DB2的临时表需要用命令Declare Temporary Table来创建, 并且需要创建在用户临时表空间上;
2). DB2在数据库创建时, 缺省并不创建用户临时表空间, 如果需要使用临时表, 则需要用户在创建临时表之前创建用户临时表空间;
3). 临时表的模式为SESSION,SESSION即基于会话的,且在会话之间是隔离的。当会话结束时,临时表的数据被删除,临时表被隐式卸下。对临时表的定义不会在SYSCAT.TABLES中出现 .;
4). 缺省情况下, 在Commit命令执行时, DB2临时表中的所有记录将被删除; 这可以通过创建临时表时指定不同的参数来控制;
5). 运行ROLLBACK命令时, 用户临时表将被删除;
下面是DB2临时表定义的一个示例:
DECLARE GLOBAL TEMPORARY TABLE results
(
RECID VARCHAR(32) , --id
XXLY VARCHAR(100), --信息来源
LXDH VARCHAR(32 ), --信息来源联系电话
FKRQ DATE --反馈时间
) ON COMMIT PRESERVE ROWS WITH REPLACE NOT LOGGED;
3. MySQL 5.X
基本上就是会话级的,与PG类似,但没有PG语法完整。
建临时表很容易,给正常的CREATE TABLE语句加上TEMPORARY关键字:
CREATE TEMPORARY TABLE tmp_table (
name VARCHAR(10) NOT NULL,
value INTEGER NOT NULL
)
临时表将在你连接MySQL期间存在。当你断开时,MySQL将自动删除表并释放所用的空间。当然你可以在仍然连接的时候删除表并释放空间。
DROP TABLE tmp_table
如果在你创建名为tmp_table临时表时名为tmp_table的表在数据库中已经存在,临时表将有必要屏蔽(隐藏)非临时表tmp_table。
如果你声明临时表是一个HEAP表,MySQL也允许你指定在内存中创建它:
CREATE TEMPORARY TABLE tmp_table (
name VARCHAR(10) NOT NULL,
value INTEGER NOT NULL
) TYPE = HEAP
因为HEAP表存储在内存中,你对它运行的查询可能比磁盘上的临时表快些。然而,HEAP表与一般的表有些不同,且有自身的限制。
4. Sybase ASE15.X
基本上就是比较裸露的语法了:
create table tempdb..t(id int primary key), 这个等价于global temp table t, server级的, 各连接都可以访问,需要显式的drop
create table #t(id int primary key), 这个等价于local temp table t, 会话级的,连接断开时会自动删除
5. MS SQL Server 200X
与Sybase类似,但多出一个变种
create table ##t(id int primary key), 这个等价于global temp table t, server级的, 各连接都可以访问,需要显式的drop
create table #t(id int primary key), 这个等价于local temp table t, 会话级的,连接断开时会自动删除
最后,Sybase ASE以及MS SQL Server使用中,需要注意会话的自动产生及断开
比如一个变量:
declare @vsql varchar(4096)
set @vsql="select * into #t123 from emp"
execute (@vsql)
set @vsql="select top 3 * from #t123"
execute (@vsql)
当你执行这个段时,你会发现,最后提示#t123不存在,因为execute在执行完时,会话即退出。要想执行成功,有两种方法:
1. 将两个sql合成一段来执行 : set @vsql = @vsql || " select top 3 * from #t123"
2. 使用global temp table, 即tempdb..t123或者SQLServer中的##t123
临时表,在ASE, SQLServer中使用频率非常高,经常出现在存储过程当中。
6. Oracle9.x and later
语法与PG一样,还提供on commit preserve rows, 和on commit delete rows功能。
但是只提供global功能,意即表本身不会自动删除。 只是提供是否保留数据的功能。这样,preserve rows相当于会话级,而on commit delete rows则相当于事务级的临时表了。用处还是蛮大的。
缺点还有:
1)不支持lob对象,这也许是设计者基于运行效率的考虑,但实际应用中确实需要此功能时就无法使用临时表了。
2)不支持主外键关系
总之,临时表的实现和使用,还真没有一个十全十美的商家。多留心一点就是了。[/size]
分享到:
相关推荐
### 数据库临时表详解 #### 一、临时表的概念与作用 在数据库操作过程中,我们经常会遇到需要存储一些中间结果或临时数据的情况。这时候,**临时表**就发挥了其独特的作用。临时表,正如其名,是根据需求临时创建...
数据库临时表空间是数据库存储临时数据的区域,它对数据库性能有着重要的影响。在执行大规模数据处理任务时,合理配置临时表空间能有效提高数据库的处理能力。 对于SQL Server数据库,参考脚本的主要内容包括创建...
总结来说,Oracle存储过程中使用临时表是优化数据处理和提高性能的有效手段,正确理解和运用会话级和事务级临时表,能更好地满足复杂的业务需求。在设计和实现存储过程时,应根据具体的应用场景选择合适的临时表类型...
总的来说,临时表和游标是数据库操作中的重要工具,理解和掌握它们的使用可以帮助我们在处理复杂数据问题时更加得心应手。在实际应用中,应根据需求选择合适类型的临时表和游标,并注意它们的生命周期管理,以优化...
### Oracle 临时表用法详解 #### 一、背景与问题描述 ...理解这两种临时表的区别和使用场景对于优化数据库性能至关重要。同时,需要注意Oracle临时表的一些局限性,以便在实际应用中做出合理的决策。
总结来说,Oracle的临时表机制提供了处理会话特定数据的解决方案,尽管存在一些限制,但通过自定义的设计和扩展,可以克服这些限制,实现更强大的功能。在使用临时表时,应考虑其生命周期、数据隔离性和性能影响,...
总结,避免SQL数据库中滥用临时表和排序,需要我们深入理解查询优化,合理设计数据库结构,以及巧妙地利用索引和内置功能。对于特殊需求,如汉字转拼音,可以借助自定义函数来扩展数据库的功能。在实践中,结合业务...
总结来说,查询Oracle表空间使用情况是数据库管理的关键环节,涉及到表空间的基本概念、数据文件、自由空间、临时表空间以及扩展和段空间管理。通过理解和掌握这些知识,数据库管理员能够更好地维护数据库的健康状态...
总结来说,Oracle的存储过程结合临时表,可以有效地处理复杂的业务逻辑,返回结果集,并在会话范围内提供一个安全、高效的工作区。在设计和编写存储过程时,灵活运用这些技术能够显著提升数据库应用程序的性能和可...
### Oracle 临时表空间详解 ...总结而言,通过上述内容我们可以了解到Oracle数据库中临时表空间的基本概念、查询方法以及如何进行创建、修改和删除等操作。掌握这些知识点有助于更好地管理和优化数据库性能。
下面通过具体的示例来进一步了解这两种临时表的区别。 ##### 1. 创建会话临时表 ```sql CREATE GLOBAL TEMPORARY TABLE Temp_User ( ID NUMBER(12) PRIMARY KEY, Name VARCHAR2(10) ) ON COMMIT PRESERVE ROWS; ...
### NC6.3 数据库参考脚本及临时表要求 #### 概述 本文档主要介绍了用友软件股份有限公司在部署NC6.3系统时针对不同数据库(SQL Server、Oracle和DB2)所需的参考脚本及对临时表空间的具体要求。这些脚本旨在帮助...
当进行排序或临时表创建等操作时,临时数据将被存储在这个数据文件中。 #### 六、总结 综上所述,在Oracle数据库中,数据库、表空间和数据文件之间存在着明确的关系:数据库包含多个表空间,而表空间又由一个或多...
【MySQL临时表】是数据库操作中的一个重要工具,尤其在处理复杂查询和优化性能时发挥着关键作用。临时表与内存表虽然名字相似,但其实两者性质不同。内存表使用Memory引擎,数据存储在内存中,系统重启后数据丢失,...
总结来说,"数据同步时过滤掉临时表"是一个关于数据迁移和管理的重要实践,它涉及到数据库操作、脚本编写、工具使用以及性能优化等多个IT领域的知识。理解和掌握这部分内容对于任何处理大规模数据的IT专业人员都至关...
系统数据库如Master、Model、Tempdb和Msdb各有其特定功能,例如Master存储系统表格和环境信息,Model作为创建新数据库的模板,Tempdb用于临时数据,Msdb服务于SQL Server代理。 创建数据库的SQL语句通常包括指定...
- **实现步骤**:同样使用`CREATE TEMPORARY TABLESPACE`命令来创建临时表空间。此外,还可以通过`ALTER SYSTEM SET DEFAULT TEMPORARY TABLESPACE`来设置其为默认临时表空间。 - **实践案例**:创建名为`index01`...
本文将详细介绍如何在Oracle中创建临时表,并探讨其应用场景以及两种主要类型的临时表:全局临时表(Global Temporary Table)与局部临时表(Local Temporary Table)的区别及其使用方法。 #### 二、Oracle临时表...
- **查询表**:查询结果对应的临时表。 - **视图表**:基于一个或多个表的虚拟表,不实际存储数据。 #### 十一、实体完整性和参照完整性 - **实体完整性规则**:关系的主属性不允许取空值。 - **参照完整性规则**...
根据给定文件的信息,我们可以总结出以下关于“NC6.1数据库参考脚本及临时表要求”的关键知识点: ### 一、SQL Server 参考脚本 #### 1. 创建数据库 - **脚本功能**:该脚本用于在SQL Server环境中创建一个名为`...