临时表主键约束问题

yibey 2012-09-10 10:53:00
CREATE TABLE #t(
[ID] [int] IDENTITY(1,1) NOT NULL,
[FK_Branch] [int] NOT NULL,
[Timestamp] [datetime] NOT NULL,
CONSTRAINT [PK_#t_BuildDataLostValue] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
我在存储过程里创建了一个临时表,主键约束PK_#t_BuildDataLostValue

然后我在存储过程里创建临时表代码后面的某个位置弄个非法语句,让它报错。然后重新执行它,就报错
说该约束PK_#t_BuildDataLostValue已经纯在!
难道临时表的消失不会伴随着约束的消失么。
如果不让存储过程主动报错的话,第二次执行存储过程就不会报错了。。
求解释下了高手
...全文
323 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
汤姆克鲁斯 2012-09-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

引用 8 楼 的回复:

引用楼主 的回复:
CREATE TABLE #t(
[ID] [int] IDENTITY(1,1) NOT NULL,
[FK_Branch] [int] NOT NULL,
[Timestamp] [datetime] NOT NULL,
CONSTRAINT [PK_#t_BuildDataLostValue] PRIMARY KEY CLUS……
[/Quote]
测试不出来提示主键已存在
yibey 2012-09-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用楼主 的回复:
CREATE TABLE #t(
[ID] [int] IDENTITY(1,1) NOT NULL,
[FK_Branch] [int] NOT NULL,
[Timestamp] [datetime] NOT NULL,
CONSTRAINT [PK_#t_BuildDataLostValue] PRIMARY KEY CLUSTERED
(
[ID] A……
[/Quote]
你说的没错,但是我真心只需要知道我的问题的原因!
算了,结贴给分吧。

自己总结下吧,当存储过程执行失败的时候,系统只回收了临时表,并未回收主键约束。执行成功的话就全部回收。

为了避免该种情况的话,
2中可行的选择,
1。在存储过程中创建事务
2. 在创建临时表的时候不要使用主键约束,自动增长就可以了,无需使用主键
qurihong 2012-09-10
  • 打赏
  • 举报
回复
得了解一下临时表的生存周期,应该不是想像的那样 --"当存储过程执行完毕后,系统回收临时表", 执行完毕是否就说明一个session结束了
yibey 2012-09-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

我也试了一下,我觉得它提示的信息更多的是告诉你表已经存在,因为我把约束注释掉执行的时候会报#t已经存在。你试一下在create table前面加上if exists来判断表是否存在。这样就不报错:
SQL code
IF OBJECT_ID(N'tempdb..#t' ) IS NOT NULL
DROP TABLE #t
CREATE TABLE #t(
[ID] [int] IDENTI……
[/Quote]

楼上的大哥在存储过程里面,临时表在存储过程运行完后回自动释放的吧
所以跟这个表存在与否是没有关系的吧
發糞塗牆 2012-09-10
  • 打赏
  • 举报
回复
我也试了一下,我觉得它提示的信息更多的是告诉你表已经存在,因为我把约束注释掉执行的时候会报#t已经存在。你试一下在create table前面加上if exists来判断表是否存在。这样就不报错:
IF OBJECT_ID(N'tempdb..#t' ) IS NOT NULL
DROP TABLE #t
CREATE TABLE #t(
[ID] [int] IDENTITY(1,1) NOT NULL,
[FK_Branch] [int] NOT NULL,
[Timestamp] [datetime] NOT NULL,
CONSTRAINT [PK_#t_BuildDataLostValue] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
yibey 2012-09-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

我想知道你弄得什么非法语句
[/Quote]
比如我不小心在字符串相加里,没有吧整数转化成字符串。只是为了报个错
yibey 2012-09-10
  • 打赏
  • 举报
回复
楼上的貌似没理解我的意思哦。。

我这里遇到的问题是在存储过程中创建临时表既然是临时表了我每次执行没必要判断该临时表是否存在,因为每个事务会自动释放的啊。。

问题所在就是当我存储过程执行失败了(由于其中某句代码非法导致的),但是这个时候该临时表已经被创建过了,然后当存储过程执行完毕后,系统回收临时表。

当我再次执行存储过程后,主键约束还在
消息 2714,级别 16,状态 4,第 1 行
数据库中已存在名为 'PK_#t_BuildDataLostValue' 的对象。
我想问的问题是为啥系统当存储过程执行失败后系统只回收了临时表,并未回收主键约束
汤姆克鲁斯 2012-09-10
  • 打赏
  • 举报
回复
我想知道你弄得什么非法语句
發糞塗牆 2012-09-10
  • 打赏
  • 举报
回复
临时表消失,基于该表的所有东西都会消失,你创建临时表的时候,加上if exists(xxx)这样判断表是否存在。这样就可以反复执行。
Andy-W 2012-09-10
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
CREATE TABLE #t(
[ID] [int] IDENTITY(1,1) NOT NULL,
[FK_Branch] [int] NOT NULL,
[Timestamp] [datetime] NOT NULL,
CONSTRAINT [PK_#t_BuildDataLostValue] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (P……
[/Quote]

这样写多session应用的时候当然有问题了,
在SQL Server中对于object来说是要求唯一不能重复的,不管是临时表还是约束,名称要求唯一。
因为用户定义object都存储在sys.objects中,主键约束PK作为object之一,存储在sys.objects中。
所以在创建临时表,定义类似主键约束,默认值等不需要指定特定的名称,不然会在多session调用时候报错。

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧