SQLSERVER临时表主键约束并发性的解决方法

本文详细解析了SQL Server中临时表与内存表的使用场景与区别,包括性能对比、创建方法及主键约束的应用技巧。了解如何根据数据量选择合适的表类型,掌握避免并发错误的创建语法。

在数据操作过程中,经常会用到临时表,如果是在存储过程中,可以使用性能更高的内存表来解决

DECLARE @T TABLE(C1 INT,C2 INT)

内存表可以理解为是一个内存变量,只在内存中定义,性能更好,但如果数据量过大则不适合使用,因为会占用过多的服务器操作系统内存资源。

而在客户端,临时表则更容易使用,可以处理较大的数据量,因为临时表是物理存在的,创建于SQLSERVER的tempdb数据库中,性能上比内存表要差一些,因为对临时表的操作要占用磁盘IO。

临时表的表示方式有两种:#表名(本地临时表),或##表名(全局临时表)。本地临时表只对于创建者是可见,当用户与 SQL Server 实例断开连接后,将删除本地临时表。全局临时表在创建后对任何用户和任何连接都是可见的,当引用该表的所有用户都与 SQL Server 实例断开连接后,将删除全局临时表。

为了提高性能,我们会在临时表上增加主键约束

CREATE TABLE #T(
    C1 INT NOT NULL,
    C2 INT,
constraint PK_#T primary key (C1)
)

结果如下

可以发现临时表的表名由系统增加了后缀,而主键名称则是用户显式指定的名称。这种方式适合创建全局临时表,但用于本地临时表时会产生并发性错误,因为该命令显式的指定了CONSTRAINT名称,而在SQLSERVER中所有的对象名称都必须是唯一的,所以当A进程创建了该临时表,对象PK_#T就已经存在了,此时B进程再使用该命令创建临时表时,就会提示:数据库中已存在名为‘PK_#T’的对象。

要解决这个问题可以换种CREATE语法来创建临时表

CREATE TABLE #T(
    C1 INT NOT NULL PRIMARY KEY,
    C2 INT NOT NULL,
    C3 VARCHAR(10) NULL
)

如果要创建多字段联合主键,可以使用下面的方法

CREATE TABLE #T(
    C1 INT NOT NULL PRIMARY KEY,
    C2 INT NOT NULL,
    C3 VARCHAR(10) NULL
)
go
ALTER TABLE #t ADD PRIMARY KEY (C1,C2)
go

这种方式创建的临时表结果如下

可以看出表和主键在系统中的名称都由SQLSERVER添加了后缀,以保证多进程之间不会发生重复。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值