2016-11-23 4 views
4

Ich habe eine Tabelle wie:ein Verbundschlüssel

Id PersonId  Phone IsPrimary 
----------------------------------- 
1  1   12345  1 
2  1   55555  0 
3  2   66666  1 
4  3   77777  1 
5  3   88888  0 
6  3   99999  0 

Wie kann ich Einschränkung erstellen, die Einfügung in dieser Tabelle erlaubt nur eine IsPrimary = 1 pro PersonId. Für alle PersonId sollte es nur eine mit IsPrimary = 1. Also, in Folge werde ich einsetzen können, um den nächsten Datensatz nicht:

Id PersonId  Phone IsPrimary 
    ----------------------------------- 
    1  1   00000  1 
+1

Ein Ansatz besteht darin, Updates für diese Tabelle nur über eine [gespeicherte Prozedur] zuzulassen (https://msdn.microsoft.com/en-us/library/ms190782.aspx?f=255&MSPPError=-2147217396). Sie können den SP verwenden, um Ihre Geschäftslogik zu erzwingen. –

+0

Wenn Sie während des Einfügens stattdessen einen Trigger erstellen, können Sie diese Bedingung überprüfen, bevor Sie den Wert – krish

Antwort

9

Sie können versuchen, einen eindeutigen gefilterten Index zu erstellen:

CREATE UNIQUE INDEX UQ_Person_isPrimary 
ON Person (PersonId, IsPrimary) 
WHERE IsPrimary = 1 
+0

eingeben. Wusste nicht, dass SQL Server dies hatte, ich dachte nur, dass Oracle es hatte. Weißt du, was die erste Version war, in der diese verfügbar war? –

+0

@RaduGheorghiu Es ist SQL Server 2008. –

+0

Wusste es auch nicht, +1. – sagi

4

Sie versuchen, eine Beziehung zwischen zwei Entitäten statt eine tatsächliche Beziehung unter Verwendung von Daten zu erstellen. Jede Person hat eine primäre Telefonnummer und mehrere nicht primäre Telefonnummern. Statt die Zahl Beziehung primäres Telefon unter Verwendung von Daten zu beschreiben (in Ihrem Fall der IsPrimary Spalt), es sollte stattdessen ein Fremdschlüssel in der Tabelle Personen sein:

Persons table 
============= 

PersonId Name  PrimaryPhoneId 
----------------------------------- 
1   Alice  1 
2   Bob  3 
3   Charlie 4 



Phones table 
============ 

Id PersonId Phone 
--------------------- 
1 1   12345 
2 1   55555 
3 2   66666 
4 3   77777 
5 3   88888 
6 3   99999 

Auf diese Weise kann eine Person nur ein primäres Telefon hat . Wenn jemand seine primäre Telefonnummer wechselt, müssen Sie nur eine Zeile aktualisieren. Wenn Sie eine Spalte IsPrimary haben, müssen Sie zwei Zeilen aktualisieren (die alte Primärdatenbank auf 0 setzen und dann die neue Primärdatenbank auf 1 setzen) und sicherstellen, dass beide Aktualisierungen in der gleichen Transaktion ausgeführt werden. Andernfalls könnte die Primärdatenbank vollständig verloren gehen wenn die zweite Zeile nicht aktualisiert werden kann.

Verwandte Themen