2010-03-27 7 views
8

Ich habe eine Datenbanktabelle, in der eine Eindeutige Schlüsseleinschränkung definiert ist, um zu vermeiden, dass doppelte Datensätze auftreten.Auf doppelte Datensätze prüfen VS versuchen, eine eindeutige Schlüsseleinschränkung zu erhalten

Ich bin neugierig, wenn es schlechte Praxis ist, manuell nach doppelten Datensätzen zu suchen, bevor eine INSERT-Anweisung in der Tabelle ausgeführt wird.

Mit anderen Worten, sollte ich eine SELECT-Anweisung mit einer WHERE-Klausel, die nach doppelten Werten des Datensatzes, den ich INSERT bin, überprüfen. Wenn ein Datensatz gefunden wird, dann nicht über die INSERT-Anweisung ausführen, sonst gehen Sie vor und die INSERT laufen ....

OR

einfach die INSERT-Anweisung ausführen und versuchen,/die Ausnahme abfangen, die durch geworfen werden kann, zu einer eindeutigen Schlüsselverletzung.

Ich Wiegen der beiden Perspektiven und nicht entscheiden kann, was Best- 1. Verwenden Sie keine SELECT Anruf verschwenden nach Duplikaten zu überprüfen, wenn ich eine Ausnahme nur Falle kann VS 2. Seien Sie nicht faul durch Implementierung hässlicher Versuch/Fang Logik VS 3. ??? Ihre Gedanken hier ??? :)

Antwort

7

Sie müssen wirklich die try..catch-Methode verwenden. Es mag weniger elegant sein, aber es ist kinderleicht.

Wenn mehrere Clients diese Tabelle aktualisieren, kann ein anderer Client einen Datensatz zwischen Ihrer Prüfung und Ihrer Einfügung einfügen. Sie können immer noch überprüfen, ob Sie sparen möchten, wenn Sie versuchen, die Einfügung unnötig zu machen. Es kann eine kleine Leistungssteigerung sein, wenn Sie sich darüber Sorgen machen, aber nur wenn ein Duplikat ist. Aber jedes Mal, wenn nicht ein ein Duplikat ist, haben Sie eine Leistungseinbuße bezahlt, indem Sie sowohl einen SELECT als auch einen INSERT durchgeführt haben.

Egal, was sind die Chancen, dass es eine Constraint-Verletzung geben wird? Wahrscheinlich klein, also warum mit dem Scheck belästigen?

3

Auch wenn Sie nach Duplikaten suchen, kann ein neues Element eingefügt werden, nachdem Sie überprüfen und bevor Sie einfügen, so dass Sie noch versuchen/catch Block benötigen.

3

Try/Catch ist sicherer und skalierbarer, da Sie den Tisch nur einmal berühren. Der try/catch entfernt die offen erratisch Fehlerbehandlung in früheren Versionen

lesson 4 from this article Siehe auch