将INT更改为BigInt

Raj*_*ore 28 sql sql-server-2005

我有一个仓库表,里面有16吨数据.我有几个Integer列.我们必须为我们编写的每个查询将这些转换为BIGINT,因为SUM太大而不适合INT.

我们现在正在开发一个新的数据集市.所以我们想,为什么不将所有这些列更改为BIGINT,我们不必担心新的查询集.

由于数据已经加载,我想我会使用Management Studio并更改数据类型.但我首先得到一个警告:

Saving Definition Changes to tables with large amounts of data could take a considerable amount of time. While changes are being saved, table data will not be accessible.

然后我收到一个错误:

Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

我该如何解决这个问题?

Mar*_*rtW 53

如果这些列中的一个或多个没有对它们的约束(如外键,索引,默认,规则等),您应该能够通过执行快速更改每个列

ALTER TABLE monster ALTER COLUMN MyIntCol1 bigint

Management Studio的更改SQL很少是最有效的,并且倾向于使用临时表来修改现有列.

  • 2020 年评论:在 SQL Server 2016 及更高版本中,您可以添加“WITH (ONLINE = ON)”,以防止中断 (2认同)

Red*_*ter 28

不确定这是否有帮助,但试试这个:

1 - create a new bigint column in the table
2 - update that new column with the values from the int column
3 - delete the int column
4 - rename the bigint column
Run Code Online (Sandbox Code Playgroud)

  • 这项技术需要注意的一点是它会改变列的顺序.虽然这个*应该是正常的,但有可能在某个地方有人依赖这种顺序是稳定的,例如当他们选择*并插入临时表时. (2认同)
  • 这适用于主键列吗? (2认同)

Con*_*ngo 8

这种技术对我来说非常好用.

我执行了:

use [Mytable]
ALTER TABLE [dbo].[USER] ALTER COLUMN USER_ID bigint NOT NULL
Run Code Online (Sandbox Code Playgroud)

这导致了此错误,因为密钥存在约束:

Msg 5074, Level 16, State 1, Line 2
The object 'PK_USER_USER_ID' is dependent on column 'USER_ID'.
Msg 4922, Level 16, State 9, Line 2
ALTER TABLE ALTER COLUMN USER_ID failed because one or more objects access this column.
Run Code Online (Sandbox Code Playgroud)

不要被吓倒,在SQL Server Management Studio中我右键单击约束PK_USER_USER_ID,然后选择"脚本键为>>删除并创建到>>新查询编辑器窗口":

在此输入图像描述

这生成了这个脚本:

USE [Database]
GO
/****** Object:  Index [PK_USER_USER_ID]    Script Date: 18/03/2014 13:05:38 ******/
ALTER TABLE [dbo].[USER] DROP CONSTRAINT [PK_USER_USER_ID]
GO

/****** Object:  Index [PK_USER_USER_ID]    Script Date: 18/03/2014 13:05:38 ******/
ALTER TABLE [dbo].[USER] ADD  CONSTRAINT [PK_USER_USER_ID] PRIMARY KEY CLUSTERED 
(
[USER_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF,        ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)

然后,我执行了此脚本的前半部分,以删除约束:

ALTER TABLE [dbo].[USER] DROP CONSTRAINT [PK_USER_USER_ID]
GO
Run Code Online (Sandbox Code Playgroud)

既然约束已经消失,原始的改变很有效:

use [Mytable]
ALTER TABLE [dbo].[USER] ALTER COLUMN USER_ID bigint NOT NULL
Run Code Online (Sandbox Code Playgroud)

然后我执行了脚本的后半部分,将约束添加回来:

ALTER TABLE [dbo].[USER] ADD  CONSTRAINT [PK_USER_USER_ID] PRIMARY KEY CLUSTERED 
(
[USER_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF,        ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)


小智 7

我认为您可能遇到的主要错误是GUI正在超时.当您使用SSMS中的修改选项应用大更改时,它将超时.如果通过在SSMS中生成更改脚本来执行相同的命令,然后作为直接SQL查询运行,则它将一直运行直到完成.