Aggiunta di un vincolo di controllo complesso

2

Sto lavorando su una tabella che ha una chiave primaria composta che include una data.

Faculty

PersonId    StartDate    EndDate    Title ....

-------------------------------------------------

Aggiungerò una chiave composta composta da PersonID e StartDate . La regola aziendale a cui sto pensando è quella di consentire a una persona aggiunta come facoltà, rimossa, e quindi aggiunta nuovamente in seguito, se necessario. Sto pensando a un professore ospite. O un'assistente che insegna un corso occasionale, ma non è un membro attivo della facoltà da un semestre all'altro.

La data di fine consentirà nulls , ad indicare che una persona è attualmente un membro della facoltà.

Voglio limitare ulteriormente i dati in modo che una persona possa avere solo una riga con una data di fine che è null .

Cose che ho considerato:

  • UDF in un vincolo di controllo
  • Trigger (odio i trigger)
  • Vincolo del livello applicazione (molto probabilmente quello che farò a questo punto)

Nota:

  • Questo è un hobby, lavora a questo tipo di progetto del fine settimana
  • L'archivio dati previsto è il database SQL di Azure
posta Mike Henderson 21.11.2015 - 13:14
fonte

1 risposta

3

Almeno per SQL Server puoi usare un vincolo univoco

Basta inserire un vincolo univoco su PersonID, EndDate
È possibile utilizzare null in un vincolo univoco e applica un valore null ma non più

L'ho provato e fa esattamente quello che stai chiedendo
L'unico problema possibile è che questo non permetterebbe anche due EndDate non Null identici - ma sospetto che sia quello che vuoi

Vincoli univoci e limiti di controllo

Unlike PRIMARY KEY constraints, UNIQUE constraints allow for the value NULL. However, as with any value participating in a UNIQUE constraint, only one null value is allowed per column. A UNIQUE constraint can be referenced by a FOREIGN KEY constraint.

Il violino è giù

CREATE TABLE [t1](
    [col1] [int] NOT NULL,
    [col2] [datetime] NOT NULL,
    [col3] [datetime] NULL,
 CONSTRAINT [PK_t1] PRIMARY KEY CLUSTERED 
(
    [col1] ASC,
    [col2] ASC
)
CREATE UNIQUE NONCLUSTERED INDEX [IX_t1] ON [dbo].[t1]
(
    [col1] ASC,
    [col3] ASC
)
insert into t1 (1,1900-01-01,1900-01-01)
             , (1,1901-01-01,null)
             , (2,1900-01-01,1900-01-01)
             , (2,1902-01-01,1902-02-01)
    
risposta data 21.11.2015 - 16:54
fonte

Leggi altre domande sui tag