2009-05-05 4 views
1

SQL-Server 2005: Ich habe eine Spalte empid in Mitarbeiter Tabelle mit Identität on.if gibt es einen Fehler beim Einfügen von Daten in Tabelle .Identität wird erhöht .Ich möchte nur die Identität inkrementiert werden wenn record eingefügt wird .wie wenn ich eine emp id von 1 bis 5 erzeugt habe und dann am 6. satz einfügungsfehler auftritt.und beim nächsten satz wird die einblendungsidentität 7 sein. ich will es 6.Identität inkrementiert nur wenn Datensatz eingefügt wird

Antwort

2

Warum möchten Sie das tun?

Die Identitätsspalte sollte nur als "interner administrativer Wert" für die Datenbank verwendet werden, und sie sollte keinen "Geschäftswert" haben. Warum ist es wichtig, dass es Lücken in dieser Sequenz gibt?
Wenn Identität korrekt verwendet wird, werden Benutzer Ihrer Software niemals mit der Spalte konfrontiert, die einen Identitätswert hat. Sie verwenden es nur, um einen Datensatz eindeutig zu identifizieren.

1

I don ' Ich denke, das kann gemacht werden. Wenn Sie möchten, dass Ihre Identitätsnummern genau sequenziell sind, müssen Sie sie möglicherweise selbst generieren, anstatt die SQL Identity-Funktion zu verwenden.

edit: Selbst wenn die fehlgeschlagenen Transaktionen zurückgesetzt werden, wird die Identity-Zählung nicht zurückgehen, dies ist beabsichtigt, siehe this other question.

0

Wenn Sie dieses spezifische Verhalten benötigen, sollten Sie gespeicherte Prozeduren verwenden, um die ID zu generieren. Auf diese Weise können Sie wirklich zu einem Rollback. Aber bedenken Sie, dass das aktuelle Verhalten absichtlich ist. Transaktionsisolation und verschiedene Lesestufen (Dirty Reads) werden Sie wahrscheinlich in Schwierigkeiten bringen, wenn Sie das ID-Feld in Ihrer Masterdatentabelle, die den aktuellen oder nächsten ID-Wert enthält, nicht sperren.

1

Welchen gültigen Geschäftsgrund haben Sie, wenn Sie Lücken haben? Es gibt keinen Grund für die Datenbank und alle Gründe dafür, dass Identitätswerte niemals für etwas anderes wiederverwendet werden sollen, da sie große Probleme mit der Datenintegrität verursachen können, indem sie Informationen basierend auf alten Berichten usw. suchen. Angenommen, Sie haben a Bericht, der die Bestellungen im letzten Monat anzeigt, und dann löschen Sie einen der Datensätze, da der Kunde dupliziert und somit dedupliziert wurde. Dann verwenden Sie das Identitätsfeld für den duplizierten Kunden, der entfernt wurde. NOW jemand, der den Bericht des letzten Monats ansieht, geht zum Kunden 12345 und die mit diesem cuisotmer verbundenen Daten gehören John Smith eher als Sally Jones. Wenn die Person das nicht weiß, weil sie ein Aggregat verwendet, hat sie jetzt falsche Informationen, die völlig vermeidbar waren. Wenn sie nach dem Kunden suchte, konnte der Prozess sie stattdessen auf den richtigen Kunden umgeleitet haben, der nach der Deduplizierung übrig war.