Изменение 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.
Как мне обойти это?
Ответы
Ответ 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 и запросит его.