Warum solltest du IGNORE_DUP_KEY NICHT auf ON setzen?

8

IGNORE_DUP_KEY = ON weist SQL Server im Wesentlichen an, nicht duplizierte Zeilen einzufügen, ignoriert jedoch automatisch alle Duplikate. Das Standardverhalten besteht darin, einen Fehler auszulösen und die gesamte Transaktion abzubrechen, wenn sich in einer Spalte Duplikate befinden, die sie nicht zulassen.

Ich habe mit einer Unmenge von Daten gearbeitet, die normalerweise mindestens ein Duplikat enthalten, wenn das nicht der Fall sein sollte. Daher verwende ich gerne UNIQUE constraints, wenn ich weiß, dass ein Wert keine Duplikate haben sollte; Aber wenn ich versuche, Daten in großen Mengen zu laden, ist das Letzte, was ich will, dass es zu 90% fertig ist und dann plötzlich in ein Duplikat läuft und das Ganze aus der Fassung bringt (Ja, ich weiß, die offensichtliche Lösung ist, dass es keine Duplikate gibt , aber manchmal habe ich nur eine Tabelle mit Daten gefüllt und gesagt, um es so schnell wie möglich zu laden).

Was ist also der Grund dafür, dass der Standardwert OFF ist und warum nicht gewünscht wird, dass er ständig aktiv ist, damit alle nicht-dup-Einträge erfolgreich ausgeführt werden können? mach dir keine Gedanken über Duplikate; Die Wahrscheinlichkeit ist, dass die Duplikate sowieso schon da sind.

Geht es um Leistung oder etwas anderes? Das scheint eine großartige Idee zu sein, aber es muss einen Grund geben, warum es nicht das Standardverhalten ist.

Gibt es hauptsächlich einen guten Grund, dieses zu verwenden, von dem ich wissen sollte, oder sollte es von Fall zu Fall ausgewertet werden?

    
Wayne Molina 10.02.2009, 18:57
quelle

5 Antworten

15

Wann immer es eine Abweichung vom "normalen" in der Datenbank gibt, möchten Sie wahrscheinlich etwas darüber wissen.

Sie haben den Schlüssel wegen einiger Zwänge, die sich aus dem geschäftlichen Zwang ergaben, der ihn diktiert hat, einzigartig gemacht. Die Datenbank hält nur an ihrer Seite fest: "Hey, du wolltest, dass das einzigartig ist, aber jetzt sagst du etwas Gegenteiliges. Entscheide dich '

Wenn dies beabsichtigt ist, können Sie die Datenbank bitten, den Mund zu halten, indem Sie IGNORE_DUP_KEY:)

verwenden     
Learning 11.02.2009, 05:11
quelle
2

Ich nehme an, dass es möglicherweise daran liegt, dass die Standardeinstellungen so eingestellt sind, dass ungültige Transaktionen nicht automatisch fehlschlagen. Alles in allem würde ich lieber wählen, wann unbeabsichtigte Konsequenzen zu ignorieren, aber bitte lass es mich wissen, wenn ich nicht anders sage.

Beispiel: Wenn ich meinen Gehaltsscheck hinterlasse, möchte ich, dass jemand bemerkt, wenn mein Arbeitgeber versehentlich doppelte Schecknummern ausstellt.

    
dkretz 10.02.2009 19:12
quelle
2
  

Die Wahrscheinlichkeit ist, dass die Duplikate sowieso irrtümlich da sind.

Ich wette, das sind sie! Sie sind Fehler. Sie möchten sicherlich über sie wissen! Turing auf IGNORE_DUP_KEY ist standardmäßig ...

  1. Fehler verstecken ...
  2. ... indem Daten korrumpiert werden. (Natürlich bleibt die Datenbank physisch konsistent, aber die Daten sind aus betriebswirtschaftlicher Sicht immer noch falsch.)

Dies ist eine schreckliche Wahl für jeden Standard.

Schalten Sie es unter besonderen Umständen ein und entfernen Sie es dann so schnell wie möglich, damit Sie nicht versehentlich Fehler verstecken.

    
usr 20.09.2012 13:10
quelle
1

Es kann als Plausibilitätsprüfung verwendet werden. Wenn Sie wissen, dass es keine Konflikte geben sollte, lassen Sie es aus und es wird schnell auf Fehler stoßen. OTOH für Ad-hoc-Konsolensitzungen, ich sehe Ihren Punkt.

    
BCS 10.02.2009 19:07
quelle
1

Ich habe eine Viele-zu-Viele Beziehung. Ich habe eine Produkt-zu-Kategorie-Tabelle mit eindeutigen Index, keine anderen Daten als Prodid und Kattid in der Tabelle.

Also setze ich IGNORE_DUP_KEY auf den eindeutigen Index (prodid, katid).

Also kann ich ruhig sagen: "füge Produkt (1,2,3) zur Kategorie (a, b, c) hinzu", ohne prüfen zu müssen, ob einige Produkte schon in einigen Kategorien sind; Ich interessiere mich nur für das Endergebnis.

    
Leif Neland 24.03.2014 12:32
quelle