私は INT データ型の製品に大きなテーブルを持っており、それは主キーと ID 列 (1,1) の両方です。行が宛先テーブルに追加されます。
列をunsigned intに変更する方法を教えてください。
私は INT データ型の製品に大きなテーブルを持っており、それは主キーと ID 列 (1,1) の両方です。行が宛先テーブルに追加されます。
列をunsigned intに変更する方法を教えてください。
データ型をbigintに変更します。
bigint -2^63 (-9,223,372,036,854,775,808) to 2^63-1 (9,223,372,036,854,775,807)
int をオーバーフローしました。これは、テーブルに約 2B 行あることを意味します。unsigned int に切り替えることで、さらに 20 億行のアドレス可能なスペースを獲得したいと考えています。このアプローチの問題は、SQL Server が unsigned int をデータ型としてサポートしていないことです。
あなたの直観的な反応は、bigint データ型に変更する Greg のアプローチに到達することかもしれません。このアプローチの課題は、処理が水中で停止している間、迅速な修正を行って bigint に変更すると、そのテーブルの他のコンシューマーが失敗することです。ちなみに、私は2011年にこれを経験しました。すべてのレポートおよび .NET アプリケーションが失敗するようにデータベースのみを修正しました。その仕事では、すべての外部向けアプリケーションを失敗させてすべての疑いを取り除くよりも、正常に見える間に N 日間処理を待ち行列に入れても、はるかに破滅的ではありませんでした。
ID 列の一般的な実装により、コードを 1 つも変更することなく、さらに 2B を簡単に取得できます。ID 値を下限に設定するだけで、bigint への移行を計画するための十分な時間を確保できます。このコマンドはdbcc checkident です。
また、ID 列が一意の値として指定されていることを確認することもできます。多くの場合、ID 列を主キーとして設定しますが、それ以外の場合は、次のようなコードを実行します。
SET NOCOUNT ON;
IF EXISTS
(
SELECT * FROM sys.tables AS T INNER JOIN sys.schemas AS S ON S.schema_id = T.schema_id WHERE S.name = 'dbo' AND T.name = 'IntOverfloweth'
)
BEGIN
DROP TABLE
dbo.IntOverfloweth;
END
CREATE TABLE
dbo.IntOverfloweth
(
IntOverflowethID int IDENTITY(2147483647,1) NOT NULL
, SomeValue varchar(30)
);
INSERT INTO
dbo.IntOverfloweth
(SomeValue)
OUTPUT
Inserted.*
VALUES
('Before');
BEGIN TRY
INSERT INTO
dbo.IntOverfloweth
(SomeValue)
OUTPUT
Inserted.*
VALUES
('Overflow');
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE() AS ErrorMessage;
END CATCH
-- Push the pointer back around to the begining
DBCC CHECKIDENT('dbo.IntOverfloweth', RESEED, -2147483648);
-- Ensure uniqueness
CREATE UNIQUE INDEX UQ_IntOverfloweth
ON dbo.IntOverfloweth
(
IntOverflowethID
);
INSERT INTO
dbo.IntOverfloweth
(SomeValue)
OUTPUT
Inserted.*
VALUES
('Does not Overflow');