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