2017-08-15 84 views
0

我對SQL很新,我期望有一列將生成5個唯一的數字。就像一個ID列,但我希望得到5個數字是隨機順序是該列的唯一SQL - 唯一列5隨機數字

例子:

56829 
73591 
17469 
46290 

我有一個id列,它是自動增量和獨特,但現在我需要另一個獨特的列,將生成5位數字,我有點看了看,顯然有一個uniqueidentifier列類型,我有它的文檔,但我不知道是否它正在尋找。 ...請幫忙!

+1

你有幾行?五位數字只需要你十萬行。 –

+0

將不會有超過6000行 – user979331

+0

基本上我正在尋找的是這是插入生成,就像auto_increment唯一ID列 – user979331

回答

5

也許一個僞隨機數就足夠了。你可以這樣做:

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

這些數字只是小於100,000的任意素數。因爲他們是素數,該數字應該不會重複1和99991.之間

編輯值:

這是很容易證明素數。假設ID1和ID2具有相同的價值:

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

然後減去他們:

(id1 - id2) * 19379 % 99991 = 0 

誠然,你需要一點數論在這一點上。但是,足以說兩個素數(19,379和99,991)沒有共同的因數。所以,這可能是唯一的方法是當id1 - id2是99,991的倍數。

(從技術上說,你所能做的就是除以19379,因爲它的倒數被明確定義。逆並不總是在模運算明確定義,但是,當他們劃分是允許的。)

後一個條件是一個奇怪的說數字不重複的方式。

編輯:

如果你想5個數字,那麼你可以使用% 89989並添加10000到結果。

+0

富有創意 - 過去你有沒有需要過這樣的東西? – Eli

+0

非常有趣!我覺得我沒有足夠的這個,所以我可以運行一個模擬出於好奇心,看到重複... – justiceorjustus

+0

是的,不是一個重複的可能Id的0-99991。 – justiceorjustus

1

我從來沒有真正使用UNIQUEIDENTIFIER這種方式,所以我可能會得到糾正。這樣,您應該能夠創建一個唯一的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( ID INT NOT NULL IDENTITY(1,1)PRIMARY KEY ,唯一ID UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID(), \t名稱VARCHAR(MAX) );',並試圖插入到此測試表中INSERT INTO TestingTable VALUES('James')'並得到此錯誤列名或提供的值數與表定義不匹配。 – user979331

+0

newsequentialid是沒用的。它們是可預測的,而不是隨機的。 –