1

MS Sqlテーブル(IDがない)のビューを作成する必要があります。新しいビューには一意のIDが含まれている必要があります。現在、私はROW番号とstuff関数を使用してIDを作成しています。

残念ながら、大きなテーブルがあると、IDが重複します。

問題は、'72799568-6EF2-4C95-84E7-4953A6959C90'私がそれをどのように解決できるかという考えにあると思いますか?

CREATE VIEW viewWithId as
SELECT convert(uniqueidentifier,
       stuff('72799568-6EF2-4C95-84E7-4953A6959C90',1,len(rn),convert(varchar,rn))) [Id],
       T.[EventId], 
       T.[EventTitle]
FROM 
    ( 
        select  x.[EventId], 
                x.[EventTitle]
                ROW_NUMBER() over (order by x.EventId) rn
        FROM    dbo.A as x 
    ) T
4

3 に答える 3

3

重複する理由は、行1、12、および127(通常、行n、10 * n + 2、および100 * n + 27)がすべて同じ識別子を返すためです。必要な場合はGUID

CREATE VIEW viewWithId as
SELECT NEWID() [Id],
       T.[EventId], 
       T.[EventTitle]
FROM 
    ( 
        select  x.[EventId], 
                x.[EventTitle]
                ROW_NUMBER() over (order by x.EventId) rn
        FROM    dbo.A as x 
    ) T

ただし、問題は、ビューを再選択したときに行ごとに異なるUUIDを取得することです。

IDからGUIDを「生成」しようとする場合は、任意のIDに対して一意であることが保証されているアルゴリズムを考え出す必要があります。別のオプションは、0から開始し、最後にIDを追加することです。

SELECT convert(uniqueidentifier,
           stuff('72799568-6EF2-4C95-84E7-000000000000',
                 36-LEN(rn),
                 len(rn),
                 convert(varchar,rn)
                )
            ) [Id],
       T.[EventId], 
       T.[EventTitle]
FROM 
    ( 
        select  x.[EventId], 
                x.[EventTitle]
                ROW_NUMBER() over (order by x.EventId) rn
        FROM    dbo.A as x 
    ) T

これにより、999,999,999,999(〜1兆)行に十分な「一意の」IDが得られます。

于 2013-03-11T13:37:49.587 に答える
2

を使用して、ランダムな新しいGUIDNEWID()を投影できます。明らかに、ランダムなGUIDを投影することは、行識別子(主キー)を投影することと同じではありません。実際、テーブルにデータベースで強制された主キーがない場合、基本的に正しい主キー値を予測する方法はありません。並行性と更新(特に削除)が存在する場合、あらゆる努力は無駄になります

于 2013-03-11T13:39:58.323 に答える
1

guidをeventidに依存させる場合は、次のコードを使用します。

CREATE VIEW viewWithId as
SELECT convert(uniqueidentifier,
       '72799568-6EF2-4C95-'
        + STUFF(CONVERT(VARCHAR(36), CAST(rn AS VARBINARY(8)), 2),5, 0, '-')
       ) [Id],
       T.[EventId], 
       T.[EventTitle]
FROM 
    ( 
        select  x.[EventId], 
                x.[EventTitle],
                ROW_NUMBER() over (order by x.EventId) rn
        FROM    dbo.A as x 
    ) T

ROW_NUMBERの完全なHEX表現がGUIDに組み込まれます。

EventIdが一意であり、行に対して変更されない場合、新しいEventIdは常に既存のすべてよりも大きくなり(IDENTITY値など)、行を削除することはなく、すべての挿入でテーブルロックが使用されます。これにより、すべての行に毎回同じ値が作成されます。上記のいずれかが指定されていない場合、これを解決する唯一の方法は、連続する実行間で値が変化するかどうかを気にしない限り、テーブルにGUID列を追加することです。

于 2013-03-11T13:46:26.927 に答える