如何快速生成100萬不重複的8位編號

2021-04-08 23:12:19 字數 2257 閱讀 8976

最近在論壇看到有人問,如何快速生成

100萬不重複的

8位編號,對於這個問題,有幾點是需要注意的:

1.如何生成

8位隨機數,生成的數越隨機,重複的可能性當然越小

2.控制不重複

3.考慮效能

針對這個問題,我寫了如下的示例來解決,希望能為有這類需求的人提供指導 生成

100萬條

8位不重複資料的示例

use

tempdb

go

--

建立測試表

create

table tb(id char

(8))

--

建立用於自動過濾重複值的唯一索引

create

unique

index ix_tb on tb(id)

with

ignore_dup_key

go

--

測試資料插入的處理時間

, 記錄開始處理的時間點

declare

@dt datetime

set@dt =

getdate

()

--

插入隨機資料

set

nocount

on

declare

@row int

set@row = 1000000

-- 設定總記錄數

while

@row >0

begin

--

顯示提示資訊

, 表示還需要插入多行資料

raiserror

('need %d rows'

, 10, 1, @row)

with nowait

--

插入隨機的位編碼資料

setrowcount @row

insert tb select

id =

right(100000000 +

convert

(bigint

,abs

(checksum

(newid

()))), 8)

from syscolumns c1, syscolumns c2

set @row = @row -

@@rowcount

end

--

顯示插入資料使用的時間

select

begindate = @dt, enddate =

getdate

(),second =

datediff

(second, @dt,

getdate

()),

go

--

顯示最終的結果記錄是否正確

select

count

(*)from tb

go

--

刪除測試

drop

table tb

解決中用到的技巧: 1.

控制產生的資料不重複,直接使用唯一索引中的

ignore_dup_key

選項,使插入資料中的重複值自動過濾,避免手工處理重複

2.

使用checksum

配合newid()

函式,使生成的資料盡量隨機,一般生成隨機數會考慮使用

rand()

函式,但這個函式是產生偽隨機值,用下面的語句測試一下,會發現產生的資料全部是一樣的,這不適用於想批量生成多個隨機數,而

newid()

函式生成的是

guid

,基本上不會有重複的,再通過

checksum

將其轉化成數字,這樣產生重複的可能性會比較小

select

top 10

rand

()

from

sysobjects

3.

在效率控制,使用迴圈

+批量生成的方式,而不是傳統的逐個生成。在

sql server

中,每個插入語句都會有乙個內部的事務處理,如果逐條插入,則事務的開銷太大,效率勢必非常低;不考慮一次性生成

100萬資料,一則因為生成的資料可能有重複的,去掉重複就沒有

100萬了,二則一次性生成

100萬資料,消耗的記憶體和

cpu資源也很高,一般的電腦可能承受不住

如何快速生成100萬不重複的8位編號?

這個問題鄒建給出了乙個方法 http blog.csdn.net zjcxc archive 2006 08 20 1099215.aspx 我給出另外乙個方法。假設我要在10000000 99999999之間產生100萬個不重複的隨機數。可以建立乙個表table1,這個表有兩個字段,乙個是所產生的...

如何快速生成100萬不重複的8位編號

最近在論壇看到有人問,如何快速生成100萬不重複的8位編號,對於這個問題,有幾點是需要注意的 1 如何生成8位隨機數,生成的數越隨機,重複的可能性當然越小 2 控制不重複 3 考慮效能 針對這個問題,我寫了如下的示例來解決,希望能為有這類需求的人提供指導 生成100萬條8位不重複資料的示例 use ...

如何快速生成100萬不重複的8位隨機編號?

假設我要在10000000 99999999之間產生100萬個不重複的隨機數。可以建立乙個表table1,這個表有兩個字段,乙個是所產生的隨機數字段 int型 另外乙個也是int型字段。使用99999999 10000000 89999999 整除 1000000 89 捨去 然後從10000000...