将INT更改为BigInt

时间:2009-09-22 20:18:27

标签: 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.

我该如何解决这个问题?

7 个答案:

答案 0 :(得分:48)

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

ALTER TABLE monster ALTER COLUMN MyIntCol1 bigint

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

答案 1 :(得分:27)

不确定这是否会有所帮助,但请尝试以下方法:

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

答案 2 :(得分:8)

这项技术非常适合我。

我执行了:

use [Mytable]
ALTER TABLE [dbo].[USER] ALTER COLUMN USER_ID bigint NOT NULL

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

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.

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

enter image description here

这生成了这个脚本:

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

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

ALTER TABLE [dbo].[USER] DROP CONSTRAINT [PK_USER_USER_ID]
GO

现在约束已经消失,原来的改变很有效:

use [Mytable]
ALTER TABLE [dbo].[USER] ALTER COLUMN USER_ID bigint NOT NULL

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

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

答案 3 :(得分:7)

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

答案 4 :(得分:2)

展开OrbMan's回答:

  • 在列列表底部添加新列(这会加快速度)
  • 如果需要,您可以批量处理10,000行左右的更新
  • 确保您处于单用户模式,或者应用程序如果“关闭”,那么没有其他人更改该表中的数据

此外,要查看Management Studio在更改表时所执行的所有工作,请单击工具栏图标,该图标看起来像带有软盘的滚动条。这将显示用于更改表的实际SQL命令。

答案 5 :(得分:2)

如果源数据永远不会超过INT限制,只需创建一个VIEW,将该列向上转换为BIGINT并对其进行查询。

答案 6 :(得分:0)

如果您使用的是SQL Server 2016,则可以对表和索引(如果有)启用压缩,然后可以将其作为元数据操作运行。如果您的表被压缩,则可以充分利用它。

1)如果它是压缩表,则查找任何其他非聚集索引。 2)您可以使用ROW或page压缩它们。与基本表相同的压缩不是强制性的。 3)一旦所有非聚集索引都被压缩,那么我们就可以使用Alter命令了。

我已经在公司完成此操作,并在博客中发布了该文章。 https://www.chiranjeevivamsydba.com/2020/07/how-to-make-datatype-change-to-run-as.html