Sql 在列上设置标识

Sql 在列上设置标识,sql,tsql,sql-server-2008,Sql,Tsql,Sql Server 2008,如何使用T-SQL修改表并在PK列上设置标识 感谢您的帮助您无法修改现有列以获得标识“属性”-您必须: 创建具有相同结构(但设置了标识)的新表 打开此新表的 将旧表中的行插入新表 放下那张旧桌子 重命名新表以使用旧表名 如果涉及外键,您还需要修复它们。事实上,您可以修改列上的标识。 请通读这篇文章 它需要的代码比ALTER TABLE tab ALTER coln SET IDENTITY多得多,不过您需要使用ALTER TABLE命令-始终在开发或预生产中首先测试 示例G似乎最符合您的要求

如何使用T-SQL修改表并在PK列上设置标识


感谢您的帮助

您无法修改现有列以获得标识“属性”-您必须:

  • 创建具有相同结构(但设置了标识)的新表
  • 打开此新表的
  • 将旧表中的行插入新表
  • 放下那张旧桌子
  • 重命名新表以使用旧表名

如果涉及外键,您还需要修复它们。

事实上,您可以修改列上的标识。 请通读这篇文章


它需要的代码比
ALTER TABLE tab ALTER coln SET IDENTITY
多得多,不过您需要使用ALTER TABLE命令-始终在开发或预生产中首先测试

示例G似乎最符合您的要求:

创建表dbo.doc_exe(列_a INT CONSTRAINT column_a_un UNIQUE); 去 ALTER TABLE dbo.doc_exe ADD

--添加主键标识列。 列_b INT标识 约束列_b_pk主键


请参见,因为您只能忽略
插入的标识列,而不能忽略
更新的标识列,因此需要一个中间表。下面是一个例子:

create table TestTable (pk int constraint PK_TestTable primary key, 
    name varchar(30))
create table TestTable2 (pk int constraint PK_TestTable identity primary key, 
    name varchar(30))
set identity_insert TestTable2 on
insert TestTable2 (pk, name) select pk, name from TestTable
set identity_insert TestTable2 off
drop table TestTable
exec sp_rename 'TestTable2', 'TestTable'

这个问题的大多数解决方案的问题在于,它们要么需要向表中添加新列,要么需要完全重建表

这两种方法都需要大量的锁定和日志记录活动,我一直觉得这很烦人,因为这是一种仅针对元数据的更改,根本不需要触摸数据页(实际上,可以通过在单用户模式下启动实例并在
sys.syscolpars
中处理一些列来直接更新元数据,但这是未记录/不支持的。)

然而,发布在上的解决方案显示了一种完全受支持的方法,可以使用
altertable…SWITCH
(credit)将其转换为仅元数据更改

示例代码。 设置没有
identity
列的测试表。 将其更改为具有
标识
列(或多或少是即时的)。 给予 清理
这就是你想要的答案吗

DBCC CHECKIDENT( 
    'DBName.dbo.TableName'
    ,RESEED --[, new_reseed_value ]
)
示例用法:

DBCC CHECKIDENT( 
    'DBName.dbo.TableName'
)
正在检查标识信息:当前标识值“1”,当前列值“1211031236”。 DBCC执行已完成。如果DBCC打印了错误消息,请与系统管理员联系

DBCC CHECKIDENT( 
    'DBName.dbo.TableName'
    ,RESEED --[, new_reseed_value ]
)
正在检查标识信息:当前标识值“1211031236”,当前列值“1211031236”。
DBCC执行已完成。如果DBCC打印了错误消息,请与您的系统管理员联系。

是的,您可以通过Enterprise Manager或SSMS执行此操作,但实际上它是在“幕后”执行的这正是我上面所描述的。参考一篇10年前的文章,其中提到的软件比OP所询问的版本早2个版本,可能也不是最好的办法……我认为较新版本的SQL Server是向后兼容的。也许我错了。此外,SQL语法比SQL Server 2000早得多。不过,它仍然是每天都用于新的查询。它会因为太旧而变得不准确吗?我不知道为什么人们对你的建议如此愤怒。SSMS中的工具比大多数自制工具更容易和安全。到目前为止,所有显示的方法也没有考虑到重建PK、FK、触发器、相关视图等tc等。就我而言,你的答案实际上是最好的答案。你实际上可以通过在单用户模式下启动实例并修改系统表来完成。令人恼火的是,在当前版本中没有安全/受支持的方法来更新此元数据。@Martin-很有趣,但你会推荐别人这样做吗?@Martin-这似乎是RedGate在某个时候会做的工具…@Damien-绝对不是,除非他们只是出于好奇在测试数据库上做这件事
DBCC CHECKIDENT( 
    'DBName.dbo.TableName'
    ,RESEED --[, new_reseed_value ]
)
DROP TABLE dbo.tblFoo
DBCC CHECKIDENT( 
    'DBName.dbo.TableName'
    ,RESEED --[, new_reseed_value ]
)
DBCC CHECKIDENT( 
    'DBName.dbo.TableName'
)
DBCC CHECKIDENT( 
    'DBName.dbo.TableName'
    ,RESEED --[, new_reseed_value ]
)