Ich habe einen Tisch und irgendwie ist dieselbe Person Person
zweimal an meinen Tisch gekommen. Im Moment ist der Primärschlüssel nur eine automatische Nummerierung, aber es gibt zwei andere Felder, die ich erzwingen möchte, um eindeutig zu sein.
Zum Beispiel sind die Felder:
ID
Name
Active
PersonNumber
Ich möchte nur 1 Datensatz mit einer eindeutigen PersonNumber und Active = 1.
(Die Kombination der beiden Felder muss also eindeutig sein.)
Was ist der beste Weg für eine vorhandene Tabelle in SQL Server? Wenn jemand anderes eine Einfügung mit demselben Wert wie ein vorhandener Wert ausführt, schlägt dies fehl, sodass ich mich in meinem Anwendungscode nicht darum kümmern muss.
sql
sql-server
Leora
quelle
quelle
Antworten:
Sobald Sie Ihre Duplikate entfernt haben:
oder
Natürlich kann es oft besser sein, zuerst nach dieser Verletzung zu suchen, bevor SQL Server versucht, die Zeile einzufügen und eine Ausnahme zurückzugeben (Ausnahmen sind teuer).
http://www.sqlperformance.com/2012/08/t-sql-queries/error-handling
http://www.mssqltips.com/sqlservertip/2632/checking-for-potential-constraint-violations-before-entering-sql-server-try-and-catch-logic/
Wenn Sie verhindern möchten, dass Ausnahmen in die Anwendung gelangen, ohne Änderungen an der Anwendung vorzunehmen, können Sie einen
INSTEAD OF
Auslöser verwenden:Wenn Sie dem Benutzer jedoch nicht mitteilen, dass er die Einfügung nicht durchgeführt hat, werden Sie sich fragen, warum die Daten nicht vorhanden sind und keine Ausnahme gemeldet wurde.
BEARBEITEN hier ist ein Beispiel, das genau das tut, wonach Sie fragen, auch wenn Sie dieselben Namen wie Ihre Frage verwenden, und dies beweist. Sie sollten es ausprobieren, bevor Sie davon ausgehen, dass die obigen Ideen nur die eine oder andere Spalte im Gegensatz zur Kombination behandeln ...
Daten in der Tabelle nach all dem:
Fehlermeldung beim letzten Einfügen:
quelle
Dies kann auch in der GUI erfolgen:
quelle
new Index
ist nicht anklickbar, es ist deaktiviert :(In meinem Fall musste ich viele inaktive und nur eine Kombination von zwei aktiven Tasten wie folgt zulassen:
Das scheint zu funktionieren:
Hier sind meine Testfälle:
quelle
Und wenn Sie viele Einfügeabfragen haben, aber nicht jedes Mal eine FEHLER-Nachricht senden möchten, können Sie dies tun:
quelle