ITPub博客

首页 > 数据库 > SQL Server > 关于identity列的探讨

关于identity列的探讨

原创 SQL Server 作者:sqysl 时间:2009-06-09 05:32:46 0 删除 编辑
今天在网上的mssql群里遇到了一个人,问到MSSQL表里的IDENTITY字段,如何让它在复制原来数据到该表时,原来数据的IDENTITY字段不变,而新插入数据时,新插入的数据的IDENTITY依然增长,我查了很多资料,做了个实验,最终解决,实验过程脚本如下:
use test1
go
drop table t1
drop table t2
go
create table t1(col1 int identity(100,1),col2 char(100))
create table t2(col1 int identity(1,1) not for replication,col2 char(100))
go
insert into t1 values('aaaaa')
insert into t1 values('bbbbbb')
insert into t1 values('cccccc')
go
set identity_insert t2 on
insert into t2(col1) select col1 from t1
go
DBCC CHECKIDENT(t2,RESEED,1)
go
insert into t2('eeeeee')
insert into t2('rrrrrr')
go
select * from t2
go
由于晚上回家后,发现昨晚的网友针对该问题又提出了疑问,我于是就决定对MSSQL的企业管理器中进行该操作进行了跟踪,主要是t-sql和procedure,结果发现和昨晚几乎差不多:
CREATE TABLE dbo.Tmp_Table_1
(
c1 int NOT NULL IDENTITY (50, 1000),
c2 char(10) NULL
)  ON [PRIMARY]
SET IDENTITY_INSERT dbo.Tmp_Table_1 ON
IF EXISTS(SELECT * FROM dbo.Table_1)
  EXEC('INSERT INTO dbo.Tmp_Table_1 (c1, c2)
  SELECT c1, c2 FROM dbo.Table_1 WITH (HOLDLOCK TABLOCKX)')
SET IDENTITY_INSERT dbo.Tmp_Table_1 OFF
DROP TABLE dbo.Table_1
EXECUTE sp_rename N'dbo.Tmp_Table_1', N'Table_1', 'OBJECT'
同时网友又提出了如果原表有约束和二进制数据的问题,那也只能是一步步实现了,比较麻烦,但MSSQL的EM的思路肯定是这么实现的。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/8484829/viewspace-605586/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
大学毕业至今,一直深耕于数据库领域20余载,擅长数据库优化、数据库分析诊断、数据库规划设计等,曾任职多家知名大型企业,多次独立承担并成功上线关键大型项目。

注册时间:2008-06-27

  • 博文量
    365
  • 访问量
    725283