2017-08-15 11 views
0

私はかなり新しいSQLです。私は5つのユニークな数字を生成する列を持つことを考えています。私は、ランダムな順序である5桁の数字を取得し、その列に一意であることが見ている以外、idカラムのような多くのSQL - ユニークな列5のランダムな数字

例:私は自動インクリメントとユニークなID列を持っている

56829 
73591 
17469 
46290 

今は別の列が必要で、5桁の数字が生成されます。これを調べて、一意の列型があり、ドキュメントがありますが、私が探しているものがわかりません。 ...助けてください!

+1

何行ありますか? 5桁で10万行になります。 –

+0

6000行以上はありません – user979331

+0

基本的には、auto_increment unique id列のように挿入時に生成されるためです。 – user979331

答えて

5

おそらく疑似乱数で十分でしょう。

alter table t 
    add id5 as ((id * 19379 + 62327) % 99991) 

数字は100000未満の任意の素数です。

これは素数のために証明することはかなり簡単です:彼らは素数なので、数字は1と99991.

EDIT間の値のために繰り返してはなりません。そのID1を想定し、ID2が同じ値を持っている:

(id1 * 19379 + 62327) % 99991) = n 
(id2 * 19379 + 62327) % 99991) = n 

そして、それらを引く:

(id1 - id2) * 19379 % 99991 = 0 

確かに、あなたはこの時点では数論のビットを必要とします。しかし、2つの素数(19,379と99,991)には共通点はありません。ですから、id1 - id2が99,991の倍数である場合は、これが真となる唯一の方法です。

(その逆は明確に定義されているので、あなたが何ができるかを技術的には、19379による除算である。逆関数は常にモジュロ演算で明確に定義されていないが、彼らは分裂しているときが許可されている。)

こと後者の条件数字が繰り返されないという幻想的な方法です。

EDIT:

あなたは5桁の数字をしたい場合は、あなたが% 89989を使用し、その結果に万を追加することができます。

+0

クリエイティブ - 過去にこのようなことが必要でしたか? – Eli

+0

非常に興味深い!私はこれについて十分な数学ではないように感じるので、私は好奇心からシミュレーションを実行し、重複を見るかもしれません... – justiceorjustus

+0

いいえ、可能なIDの0-99991のための1つの重複。 – justiceorjustus

1

私はこのようにUNIQUEIDENTIFIERを実際に使用したことはないので、修正される可能性があります。この方法では、行の一意の自動生成IDとして一意のGUIDを作成できるはずです。

CREATE TABLE MyTable (
    Id INT NOT NULL IDENTITY(1,1) PRIMARY KEY 
    ,UniqueId UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID() 
    ,...Other columns 
); 
+0

うん、それはうまくいくだろう。 – Greenspark

+0

私は 'CREATE TABLE TestingTable( 同上INT NULL NOT IDENTITY(1,1)PRIMARY)一意ID UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID( KEY、 \t名VARCHAR(MAX) )のようにテストするためにテーブルを作成し、'とする試みこのテストテーブルにINSERT INTO TestingTable VALUES( 'James') 'を挿入し、このエラーが発生しました。列名または指定された値の数がテーブル定義と一致しません。 – user979331

+0

newsequentialidはむしろ役に立たない。それらは予測可能であり、少なくともランダムではない。 –

関連する問題