Sql server 将SQL Server中的自动增量主键字段从SMALLINT更改为INT

Sql server 将SQL Server中的自动增量主键字段从SMALLINT更改为INT,sql-server,int,primary-key,auto-increment,alter-column,Sql Server,Int,Primary Key,Auto Increment,Alter Column,将主键字段从SMALLINT更改为INT的最佳方式(低影响/低风险)是什么?该字段配置为使用“标识增量”自动增量 我从以下SQL开始: ALTER TABLE category_types ALTER COLUMN id INT NOT NULL; 但是,它会生成以下错误: ALTER TABLE ALTER COLUMN id失败,因为一个或多个对象访问此列 还需要什么?我需要先放下钥匙,然后再重新创建吗?这会影响自动递增吗 注意:该表没有太多行,因此解决方案的性能并不重要。这是sql se

将主键字段从SMALLINT更改为INT的最佳方式(低影响/低风险)是什么?该字段配置为使用“标识增量”自动增量

我从以下SQL开始:

ALTER TABLE category_types ALTER COLUMN id INT NOT NULL;
但是,它会生成以下错误:

ALTER TABLE ALTER COLUMN id失败,因为一个或多个对象访问此列

还需要什么?我需要先放下钥匙,然后再重新创建吗?这会影响自动递增吗


注意:该表没有太多行,因此解决方案的性能并不重要。

这是sql server management studio的输出,但应该会有所帮助。它包括创建一个临时表,然后将现有数据复制到新表中。删除原始表并重命名临时表。如果表是空的,它不会这样做,只需修改原始表即可<代码>设置标识\u插入[表]开/关允许您在插入时设置标识列

/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_category_types
    (
    id int NOT NULL IDENTITY (1, 1),
    )  ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_category_types SET (LOCK_ESCALATION = TABLE)
GO
SET IDENTITY_INSERT dbo.Tmp_category_types ON
GO
IF EXISTS(SELECT * FROM dbo.category_types)
     EXEC('INSERT INTO dbo.Tmp_category_types (id, x)
        SELECT CONVERT(int, id), x FROM dbo.category_types WITH (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT dbo.Tmp_category_types OFF
GO
DROP TABLE dbo.category_types
GO
EXECUTE sp_rename N'dbo.Tmp_category_types', N'category_types', 'OBJECT' 
GO
ALTER TABLE dbo.category_types ADD CONSTRAINT
    PK_category_types PRIMARY KEY CLUSTERED 
    (
    id
    ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO
COMMIT

除了将IDENTITY_INSERT设置为off之外,在更改数据类型之前,还必须取消关联关系(主键、外键)。之后,您必须再次链接它们

例如:

-- Change from smallint to int
SET IDENTITY_INSERT category_types OFF
alter table category_types drop CONSTRAINT CategoryTypesPK
alter table category_types alter column id int
alter table category_types add CONSTRAINT CategoryTypesPK PRIMARY KEY (id)
SET IDENTITY_INSERT category_types ON

我意识到这是一篇古老的帖子,但只是为了防止有人无意中发现:jciberta给出了一个带有轻微错误的答案。应改为:

--从smallint更改为int

SET IDENTITY_INSERT category_types ON

ALTER TABLE category_types DROP CONSTRAINT CategoryTypes

ALTER TABLE category_types ALTER COLUMN id INT

ALTER TABLE category_types ADD CONSTRAINT CategoryTypesPK PRIMARY KEY (id)

SET IDENTITY_INSERT category_types OFF

您好,我对sql server没有专业知识,但我认为您忘记了ALTER语句末尾的“标识”。