2017-03-11 4 views
0

Ich habe folgende Tabelle:Wie ein Feld für jede Gruppe eindeutig?

CardsTable: 
------- 
CardID int 
PersonID int 
Number int 
----------------------- 
CardID PersonID Number 
    1   10   22 
    2   10   22 
    3   11   24 
    4   11   24 
    5   10   22 

Number field sollte für alle personID eindeutig sein, die die gleichen IDs haben.

Following example is invalid: 

CardID PersonID CardID 
    6   11   22 
    7   12   22 
    8   12   24 

Wie bedingte eindeutige Einschränkung zu implementieren, verwenden?

+0

Warum Sie nicht über die'Anzahl verwenden 'als' KartenID' ?? – Susang

+0

http://stackoverflow.com/questions/866061/conditional-unique-constraint –

Antwort

0

Sie sollten einen Trigger über den Tisch für „Einfügen“ und „update“ wie folgt implementieren:

Create trigger trigger_cardstable_insert on cardstable 
after insert 
as 
Begin 
set nocount on; 
if (select count(c.personid) from cardstable c inner join inserted i on i.personid group by i.personid, c.number) > 1 
    Begin 

     Delete cardstable 
     From cardstable c inner join inserted i on i.cardid = c.cardid 
End 
End 

Für Update wäre es ein wenig anders sein, und Sie müssen eine weitere Bedingung hinzuzufügen:

Create trigger trigger_cardstable_update on cardstable 
after update 
as 
Begin 
set nocount on; 
if update(number) and personid(select count(c.personid) from cardstable c inner join inserted i on i.personid group by i.personid, c.number) > 1 
    Begin 

     Delete cardstable 
     From cardstable c inner join inserted i on i.cardid = c.cardid 
End 
End 
+0

Ich möchte bedingte eindeutige Einschränkung verwenden. –

+0

Ich fürchte, du kannst nicht. – AHBagheri

1

Sie einen Scheck einschränken mit einer benutzerdefinierten Funktion verwenden können:

erstellen Sie zunächst die Funktion:

CREATE FUNCTION dbo.CheckCards 
(
    @PersonId int, 
    @Number int 
) 
RETURNS bit 
AS 
BEGIN 

IF EXISTS 
(
    SELECT 1 
    FROM CardsTable 
    WHERE PersonId = @PersonId 
    AND Number <> @Number 
) 
BEGIN 
    RETURN 1 
END 
RETURN 0 

END 

GO 

Nun erstellen und Beispieltabelle füllen:

CREATE TABLE CardsTable 
(
    CardID int, 
    PersonID int, 
    Number int, 
    CONSTRAINT ck CHECK (dbo.CheckCards(PersonId, Number) = 0) 
) 

INSERT INTO CardsTable VALUES 
(1, 10, 22), 
(2, 10, 22), 
(3, 11, 24), 
(4, 11, 24), 
(5, 10, 22) 

Dann die Prüf-Integritäts testen:

BEGIN TRY 
    INSERT INTO CardsTable VALUES (3, 10, 24) 
    SELECT 'Success' As [Insert] 
END TRY 
BEGIN CATCH 
    SELECT 'Failed' As [Insert] 
END CATCH 

SELECT * 
FROM CardsTable 

Ergebnisse:

Insert 
Failed 

CardID PersonID Number 
1  10   22 
2  10   22 
3  11   24 
4  11   24 
5  10   22 
Verwandte Themen