Подтвердить что ты не робот

Изменение INT на BigInt

У меня есть таблица склада с 16 т данных. У меня есть несколько столбцов Integer. Мы должны передать их в BIGINT для каждого запроса, который мы пишем, потому что SUM слишком велик, чтобы соответствовать INT.

Теперь у нас есть новый datamart. Поэтому мы подумали, почему бы не поменять все эти столбцы на 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.

Как мне обойти это?

4b9b3361

Ответ 1

Если один или несколько из этих столбцов не имеют ограничений для них (например, внешний ключ, индекс, значение по умолчанию, правило и т.д.), вы должны иметь возможность быстро изменять каждый из них, выполняя

ALTER TABLE monster ALTER COLUMN MyIntCol1 bigint

Смена Management Studio SQL редко бывает наиболее эффективной и имеет тенденцию поощрять временные таблицы для любого изменения существующего столбца.

Ответ 2

Не уверен, что это поможет, но попробуйте следующее:

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

Ответ 3

Я думаю, что основная ошибка, с которой вы, возможно, сталкиваетесь, заключается в том, что графический интерфейс - это то, что выберет время. Когда вы применяете большие изменения, используя выбор "Изменить" из SSMS, он будет отключен. Если вы возьмете ту же команду, вызвав изменение script в SSMS, а затем запустите его как прямой SQL-запрос, он будет работать до завершения.

Ответ 4

Эта техника работала очень хорошо для меня.

Я выполнил:

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, затем выбрал "Script как → Drop and Create To → New Query Editor Window":

enter image description here

Это сгенерировало этот script:

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

Затем я выполнил первую половину этого script, чтобы удалить ограничение:

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

Теперь, когда ограничение исчезло, исходное изменение сработало красиво:

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

Затем я выполнил вторую половину script, чтобы добавить ограничение обратно в:

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

Ответ 5

чтобы развернуть ответ OrbMan:

  • добавьте новые столбцы в нижней части списка столбцов (это значительно ускорит его).
  • вы можете делать свои обновления партиями по 10 000 строк или, если необходимо,
  • убедитесь, что вы находитесь в однопользовательском режиме или приложение, если "ВЫКЛ", чтобы никто другой не изменял данные в этой таблице.

Кроме того, чтобы увидеть всю работу, которую студия управления делает при изменении таблицы, щелкните значок панели инструментов, который выглядит как прокрутка с дискеткой на нем. Это покажет фактические команды SQL, используемые для изменения вашей таблицы.

Ответ 6

Если исходные данные никогда не превышают предел INT, просто создайте VIEW, который поднимет этот столбец BIGINT и запросит его.