2009-07-30 13 views
0

Ich würde besser gefällt, um die Unterschiede zu verstehen für zwischen der Verwendung von CHECKSUM vor einem INSERT Einzigartigkeit in einem Datensatz Überprüfung (mit eindeutigen) gegen selbst verweisende Tabelle Aussage wie der eine unten. Welche Szenarien würden eine Option darstellen, um die beste Wahl gegenüber der anderen zu sein, und aus welchen Gründen?SQL-Tabelle Selbstreferenz Abfrage vs. eindeutige Einschränkungen Prüfsumme

Anforderung: Jeder Satz von Spalten muss aus jedem Datensatz in der Tabelle eindeutig sein, weshalb ich diese Aussage zusammenstelle; um nach allen Spalten in einem Aufruf der Datenbank zu suchen.

INSERT INTO tblTable 
(Column1, Column2, Column3, Column4, Column5, Column6) 
SELECT 
@Column1, @Column2, @Column3, @Column4, @Column5, @Column6 
WHERE NOT EXISTS 
    (SELECT DISTINCT 
     t1.Column1, 
     t1.Column2, 
      t2.Column3, 
      t2.Column4, 
       t3.Column5, 
       t3.Column6 
    FROM tblTable t1 
     JOIN tblTable t2 ON (t1.UID = t2.UID) 
     JOIN tblTable t3 ON (t1.UID = t3.UID) 
    WHERE 
     t1.Column1 = @Column1 and 
     t1.Column2 = @Column2 and 
      t2.Column3 = @Column3 and 
      t2.Column4 = @Column4 and 
       t3.Column5 = @Column5 and 
       t3.Column6 = @Column6) 

Antwort

1

eine eindeutige Einschränkung verwendet, wird gewährleistet, dass die eingeschränkten Daten einzigartig ist, unabhängig davon, wie es eingesetzt wird (von Hand aus Abfrage-Editor über eine gespeicherte Prozedur, über ein ORM Werkzeug oder eine andere Abstraktionsschicht). Es ist nicht darauf angewiesen, dass Entwickler sich daran erinnern, bei jeder Abfrage, die sie schreiben, zu überprüfen, dass sie nicht gegen das Prinzip verstoßen. Es macht auch Ihre Abfragen weniger kompliziert und einfach zu lesen. Keine Chance für Fehler.

+0

Wenn in einer Tabelle unter Verwendung der einzigartigen Einschränkungen, wie und wo ich anmelde behandeln der Benutzer, dass diese Werte für ihre Verwendung nicht verfügbar sind, da sie bereits verwendet werden? – Cameron

+1

Es hängt sowohl von der SQL-Variante, die Sie verwenden, als auch von der Programmiersprache ab, die Sie verwenden. Wenn es sich um SQL Server/.NET handelte, konnten Sie eine SqLException abfangen und diese verwenden, um Ihre Fehlermeldung zu generieren. Siehe http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlexception.aspx –

1

Warum brauchen Sie mehr als diese NOT EXISTS-Klausel?

NOT EXISTS 
    (SELECT * 
    FROM tblTable t1 
    WHERE 
     t1.Column1 = @Column1 and 
     t1.Column2 = @Column2) 

Ernsthaft.

Ich habe es nie durch gedacht ... aber der Self-Join impliziert eindeutige Prüfungen über mehr als eine Zeile (oder einzigartig über eine Gruppe von Zeilen oder Unique über Eltern/Kind-Zeilen?). Welche würde entkräften die einzigartige Reihe Konzept ...

bearbeiten, am 2. Lesung

Nur eine standard unique constraint verwenden.

Keine Notwendigkeit für CHECKSUM, die sowieso keine Eindeutigkeit garantiert.

Allerdings gibt es eine kleine Chance, dass die Prüfsumme nicht ändert. Aus diesem Grunde empfehlen wir nicht CHECKSUM verwenden zu erkennen, ob Werte geändert, es sei denn, Ihre Anwendung eine Änderung tolerieren kann gelegentlich fehlende

+0

Aus diesem Grund habe ich die Beispielabfrage auf diese Weise geschrieben - der "Self-Join impliziert eindeutige Prüfungen über mehr als eine Zeile" . – Cameron