2012-01-26 11 views
1

テーブルの既存のレコードの隣に一意の疑似乱数を挿入することはできますか?ユニークなPRNGをDb列に挿入する

ような何か:私は繰り返しコードを、あるいはマルチでこれを行うことができます知っています

UPDATE Products P1 
SET RandomId = Random() 
WHERE NOT EXISTS (
    SELECT Id 
    FROM Products P2 
    WHERE RandomId = [The same random as above] 
) 

(はい、私はちょうどそれらを解決し、競合をしませスキップだろう知っています)

に行のステートメント - 私のためにこれを行う単一のコマンドはありますか?

NB:この質問は私自身の啓発のためであり、Microsoft SQL ServerとMySQLはどちらも高く評価しています。ありがとう。あなたは1時間以上同じ値以上使用する必要があるため

+0

ランダムフロートで終わらない可能性がありますループを作成することができますか?ランダムな整数?どちらの値の間? –

+0

ランダムな整数 - maxsizeの下には実際の上限はありませんが、例えば1e9という制限を置くことができれば便利です。 – Basic

+0

明確にするために、1e9 = 1x10^9 – Basic

答えて

0

この種の操作にランダムを使用しないでください。シーケンス番号を使用する必要があります。あなたがランダム使用する場合は、宝くじのようなランダムな期待:)

あなたはユニークなランダムを使用したい場合は、あなたのような何か実行する必要があります。

select @max := max(RandomId) from Products; 
update Products set RandomId = @max := @max + Rand() + 1; 
  • 1のランドがないことを確認していますゼロを返します。

それとも、3回宇宙の年齢:)

+0

回答ありがとうございますが、なぜこの(架空の)ケースでシーケンスが必要なのでしょうか?それを除いて、あなたの解決策には、アドレス可能なスペースを食い尽くすことがあります。おそらくは非常に速いです。ギャップを埋めることは決してありません。私が誤解していない限り? – Basic

+0

私はこれが複数のステートメントであるとも言及しておきたいと思います。もし私がそれをしたければ、無作為に生成して、それが存在しないことを確認します。 1つの操作で一意のRndを挿入します)。 – Basic

+0

1つのクエリであまりにも多くのことをしたい: 1.空白を埋める。 2. 1つのクエリを使用します。 3.重複をチェックします。 4.シーケンスは使用しません。 答えは特に(3)ではありません。 – vimdude

0

は、変数に

SELECT NEWID() 

負荷それを試してみてください。

+0

私が知っている誰かが複数のメーカーから部品番号を抽象化することを計画しているので、質問が出てきました。このため、番号は電話で(彼の場合は)使用されます。 100のソリューションがありますが、私はSQLの知識を広げたかったのです。 – Basic