2016-06-29 8 views
0

Ich habe eine einfache Tabelle:Wie kann ich den Wert eines Feldes in einer Tabelle als Zufallszahl aktualisieren, die die meiste Zeit einzigartig ist?

CREATE TABLE [dbo].[Word] (
    [WordId]  INT   IDENTITY (1, 1) NOT NULL, 
    [NameId]  INT   NOT NULL 
    PRIMARY KEY CLUSTERED ([WordId] ASC) 
); 

ich einen eindeutigen Index für NameID haben

Ich versuche, diese Tabelle zu aktualisieren und eine Spalte mit einer Zufallszahl ändern:

UPDATE Word SET NameId = ROUND(RAND()*2147483647,0) 

I erkennen, dass es eine sehr, sehr kleine Chance gibt, dass dies nicht funktioniert, aber es tatsächlich jedes Mal versagt, obwohl die Tabelle nur eine sehr kleine Anzahl von Zeilen hat, schlägt das Update immer fehl und sagt, dass es ein Duplikat gibt.

Kann mir jemand sagen, was hier passiert und auch eine Möglichkeit vorschlagen, diese Tabelle zu aktualisieren, so dass es keine doppelten Werte von NameId die meiste Zeit erstellt.

+0

Ich habe gerade versucht Ihren Code ohne eindeutigen Index auf 20 Zeilen und jedes Ergebnis war der gleiche Wert –

+0

Sie erhalten wahrscheinlich viele Duplikate mit dieser Methode – FLICKER

Antwort

2

Du jeden NameID mit dem gleichen Wert zu aktualisieren, verwenden Sie WHERE Anweisung nur eine Zeile

EDIT zu aktualisieren: Diese den Trick tun sollten, das Sie suchen, newid() erzeugt neue ID für jede Zeile

UPDATE Word SET NameId = abs(checksum(NewId()) % 2147483647) 
+0

Ich muss 500 Zeilen mit jedem anders aktualisieren. Nicht sicher, was du meinst über die WHERE-Anweisung, wenn ich das 500 Mal ausstelle. Ich muss einen Weg finden, um die Zeilen zu durchlaufen, die ich denke. –

+0

Es tut mir leid, es ist früh am Morgen hier und es dauerte eine Minute für mich zu sortieren, Sie wollen dies, ich redigierte meine Antwort und hoffe, es funktioniert für Sie :) –

+0

Danke. Ich werde das ausprobieren. Zum Testen möchte ich das zunächst auf einer anderen Tabelle testen. Wie kann ich eine andere Tabelle aus der Word-Tabelle erstellen, die alle Wortdaten enthält? Ich habe versucht "Create table word2 as select * from word", aber das funktioniert nicht. –

0

Wie viele Zeilen haben Sie? Es könnte ein Fall der birthday paradox sein.

SELECT ROUND(RAND()*2147483647,0) FROM Word 

Sind die Zahlen wirklich brauchen, um pseudo-zufällige

:

Haben Sie versucht das zu tun? Sie könnten row_number() verwenden, um sie zu erhöhen.

+0

Ich habe etwa 500 Zeilen in der Tabelle. Ich möchte sie wirklich zufällig machen, wenn möglich und nicht sequentiell. Hynek bemerkte, dass ich die Zeilen mit demselben Wert aktualisierte. Könnte das das Problem sein? Ich dachte, es würde durch jede Zeile gehen und einen anderen Wert verwenden, aber jetzt bin ich mir nicht sicher. Ich möchte, dass jede Zeile einen anderen Wert hat. Danke –

Verwandte Themen