2012-03-08 5 views
1

int型のID列を持つ新しいテーブルを設計しています。毎日500.000を超える挿入があると想定されています。どのようにして最大値を超えるIDフィールドの問題を回避できますか? 私のサンプル表は、スニペットを作成するには、もっとして2^31-1を期待している場合は自動識別フィールド最大値ステータス

CREATE TABLE IntegratorQueue(
     ID int PRIMARY KEY IDENTITY(0,1),--IDENTITY, 
     RefDetailId UNIQUEIDENTIFIER NOT NULL, 
     RefStartDate datetime 
     ) 

おかげ

答えて

1

であることBIGINTを使用することができます。 GUIDの最大容量は2^128です。

CREATE TABLE IntegratorQueue(
     ID UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),--IDENTITY, 
     RefDetailId UNIQUEIDENTIFIER NOT NULL, 
     RefStartDate datetime 
     ) 

INT IDが最大値を超える時期を知る必要がある場合は、挿入前に確認する必要があります。たぶん、DBCC CHECKIDENT(テーブル名、RESEED、currentseed +挿入)

INSERT INTO IntegratorQueue(RefDetailId, RefStartDate) 
    VALUES (NEWID(), GETUTCDATE()) 

-- INT capacity (-2,147,483,648) to (2,147,483,647) 

    IF 2147483647 - SCOPE_IDENTITY() < 500000 
    --... Do something... send an Email (xp_sendmail. http://msdn.microsoft.com/en-us/library/aa260697(v=sql.80).aspx) 
    -- Insert Notification records into an another table... 
    -- return with 1, or something else, like the end of your query instead of RETURN 0 RETURN 1 and check this... so on... 

+0

はいDBCCのCHECKIDENTは私が思うにこれを扱うためにもっと気に入っています.... ID値がUIで使用されるので、私はそれがintであることを好みました。 – dankyy1

2

を下回っています。そして、あなたがBIGINTを使用するたくない場合はPKとしてあなたのテーブルにGUID(UNIQUEIDENTIFIER)を使用することができます2^63-1

CREATE TABLE IntegratorQueue(
     ID BIGINT PRIMARY KEY IDENTITY(0,1),--IDENTITY, 
     RefDetailId UNIQUEIDENTIFIER NOT NULL, 
     RefStartDate datetime 
     ) 
+0

ので、1日、それはまた、超過することができます...私は「アイデンティティをどのように処理するかを答えを見つけるために焦点を当てmの最大値を超えました。.. – dankyy1

+2

@ dankyy1:テーブルのプロ秒に挿入する予定のアイテムはいくつですか? 'int'(2^31-1 = 2,147,483,647)や' bigint'(2^63-1 = 9,223,372,036,854,775,807)を超えるまでに何百万年も待つ必要があるか計算できます。 – Oleg

+0

1日に100万レコードを挿入したとしても、BIGINTの制限を超えるには250億年かかるでしょう。この種の将来の校正はほとんど必要ありません。 – GarethD

関連する問題