2010-11-20 7 views
-4

Ich habe eine Tabelle, in der ich eine Spalte (N) als "is identity" festlege, so dass sie jedes Mal um 1 erhöht werden kann, wenn ich etwas zur Tabelle hinzugefügt habe. Wie ordne ich N neu, wenn ich eine Zeile lösche?Nummerierung einer Identitätsspalte

Zum Beispiel, wenn ich 5 Dinge zur Tabelle hinzugefügt hätte, würde N 1,2,3,4,5 gehen. Aber wenn ich Zeile 3 lösche, wird N 1,2,4,5 sein. Ich möchte, dass es die Werte automatisch ändert, so dass N 1,2,3,4 ist.

+5

Warum sollten Sie jemals Kennungen neu nummerieren? Wenn Sie die Identität wiederverwenden müssen, erstellen Sie den Bezeichner als gruppierten Index. – CarneyCode

Antwort

0

Sie könnte es tun, aber es wäre eine schreckliche Idee.

Stattdessen ist es besser nicht, diese Zahl zu speichern, überhaupt in der Datenbank, da die Anzahl nicht auf die Daten in den Reihen zugeordnet ist, sondern auf die Reihenfolge in der Sie sie wollen abgerufen werden. Eine bessere Lösung besteht darin, eine Sortierreihenfolgespalte (die Lücken enthalten darf) zu verwenden und ROW_NUMBER zu verwenden, wenn Sie die Daten zum dynamischen Generieren der Zeilennummern auswählen.

0

Es gibt wahrscheinlich eine noble Möglichkeit, dies zu tun, aber Sie könnten in eine tmp-Tabelle auswählen, die ursprüngliche Tabelle abschneiden und neu einfügen. Stellen Sie sicher, dass Sie es in einer Transaktion einpacken.

0

Ich nehme an, dies wird sich auf die Leistung der Anwendung auswirken. Wenn Sie alle IDs neu anordnen müssen, sollten Sie dies unter der folgenden Adresse tun:
1) Codepage (Neuordnung in der Datentabelle und Übermittlung der Änderungen) ODER
2) SQL-Seite (über Trigger/gespeicherte Prozeduren/temporär Tabellen)

9

Der Wert "identity" ist nicht als "Zähler" im Sinne Ihrer Frage gedacht. Der Identitätswert macht jede Zeile eindeutig und soll nicht geändert werden, obwohl sie geändert werden kann. Wenn Sie einen Zeilenzähler benötigen, erstellen Sie einen einfachen int oder bigint, und verwenden Sie dann einen Tabellentrigger, um den Wert beim Einfügen und Löschen zu aktualisieren.

+0

Ich mag normalerweise keine Antworten, die sagen "Du machst es falsch". Ich nehme immer an, dass das OP seine Gründe hat und sie sollten eine direkte Antwort auf eine direkte Frage haben. Ich denke, das könnte die Ausnahme sein. –

+0

@IainMH, oft "du machst es falsch" ist die beste Antwort. Es wäre unprofessionell, nicht darauf hinzuweisen, wenn es wirklich eine schlechte Idee ist. – HLGEM

0

Es ist eine Menge Arbeit zu tun, was Sie wollen und dann, wenn Sie es falsch verstehen, haben Sie Race-Bedingungen und das wird am Ende ein Problem mit der Datenintegrität erstellen. Dies ist eine sehr schlechte Idee.

Nun bittet der Client gelegentlich darum und die richtige Aktion ist zu sagen: "Nein, das ist eine schlechte Idee. Es kostet Sie wesentlich mehr Entwicklungs-und Wartungskosten, es wird erheblich das Risiko von Datenfehlern erhöhen zu der falschen Aufzeichnung und es wird wesentlich Ihr Risiko erhöhen, eine neue Aufzeichnung zu suchen, die nicht mit dem Problem in Verbindung steht, wenn Sie etwas aus der Vergangenheit recherchieren, das die Nummer vorher verwendete. " (Denken Sie zum Beispiel daran, Bestellnummern wiederzuverwenden, der alte Mitarbeiter hat diese Bestellnummer erhalten und fordert Sie auf, danach zu fragen, aber Sie haben ihn gelöscht und die Bestellung eines anderen Kunden ist da.) Und für all diese zusätzlichen Kosten und Risiken gewinnen Sie genau nichts. Es gibt praktisch keine Umstände, bei denen Sie wirklich Aufzeichnungen überspringen können, außer ein paar zwanghafte Manager, die keine Lücken sehen wollen. Selbst sie geben normalerweise nach, wenn Sie ihnen erklären, dass der Prozess eher Fehler verursacht und wesentlich mehr kostet. Meistens ist dies eine selbst auferlegte Anforderung durch den Entwickler und es gibt keine Entschuldigung, dies jemals zu tun, es sei denn, Sie haben einen Kunden, der nicht anders überzeugt werden kann.

Verwandte Themen