none
Vincolo Check su doppia chiave RRS feed

  • Domanda

  • Ciao a tutti,
    su una tabella in un db sql server,vorrei creare un vincolo check per impedire che vengano inseriti nuovamente dei dati nella mia tabella documenti.
    attualmente la mia tabella
    ha diversi capi tra cui l'id che é chiave primaria, e poi due campi numerici che sono idCliente e idDossier.
    nella tabella possono essere presenti più record(documenti) per un cliente e più record(documenti) per un dossier.
    Quello che voglio evitare che un cliente (per esempio con id 20) possa aggiungere più di un documento per il dossier (1500)
    Quindi vorrei creare un vincolo check per impedire che se esiste già un record con quel idCliente e quel idDossier l'insert non venga effettuato.
    Potete indicarmi lo script per creare qualcosa del genere?
    Grazie

    http://www.fuossbook.it

    mercoledì 10 luglio 2019 21:23

Risposte

  • Se le due Foreign Key possono essere nulle, potresti avere un problema di modello dei dati.
    A naso, direi che idCliente è una Foreign Key verso la tabella dei clienti, così come idDossier per la tabella dei dossier: come fanno ad essere nulli?

    Alberto Dallagiacoma [MCP, MCTS]

    My Italian Blog | Twitter | LinkedIn
    DotDotNet - User Group .NET Emilia Romagna

    Ciao, concordo con la conclusione di Alberto. NULL è considerato un valore come qualsiasi altro by design. Se vuoi utilizzare il NULL, puoi creare un indice UNIQUE come questo ed evitare duplicati nelle FK.

    CREATE UNIQUE NONCLUSTERED INDEX [idx] ON [dbo].[Autore]([Autore] ASC,[Titolo] ASC)

    ed avere una situazione di questo tipo:


    HTH,

    Cris

    Please Mark This As Answer if it solved your issue or Vote This As Helpful if it helps to solve your issue. Thank you!

    venerdì 12 luglio 2019 07:10
  • Hmmm, se il requisito di business è questo (ed io l'ho capito bene... :-) ), non trovo molto sensato mettere nella stessa tabella idDossier e idUtente, perché viola la 1NF.

    se un documento può essere associato ad un dossier o ad un utente, serviranno due tabelle:

    1. Associazione IDDocumento - IDUtente
    2. Associazione IDDocumento - IDDossier

    In questo modo andrai ad inserire i record nelle tabelle solo se l'associazione è esistente, potrai mettere i vincoli di integrità referenziale e rispettare la 1NF.

    La soluzione di Cristiano è corretta, perché ti permette di creare un indice univoco che ammette anche i valori nulli, evitandoti le duplicazioni, ma il modello relazionale così fatto ti potrebbe dare qualche grattacapo...

    My 2 cents... :-)


    Alberto Dallagiacoma [MCP, MCTS]

    My Italian Blog | Twitter | LinkedIn
    DotDotNet - User Group .NET Emilia Romagna

    venerdì 12 luglio 2019 13:42

Tutte le risposte

  • Ciao,

    dovrebbe essere sufficiente applicare un constraint di tipo UNIQUE come questo:

    ALTER TABLE dbo.yourtablename
      ADD CONSTRAINT uq_yourtablename UNIQUE(idCliente, idDossier);



    HTH,

    Cris

    Please Mark This As Answer if it solved your issue or Vote This As Helpful if it helps to solve your issue. Thank you!

    giovedì 11 luglio 2019 06:56
  • Ciao Grazie per la risposta,

    penso che lo script sia giusto ma ho un problema da risolvere, in alcuni casi queste due chiavi sono NULL e quindi non mi fa creare il vincolo


    http://www.fuossbook.it

    giovedì 11 luglio 2019 15:35
  • Se le due Foreign Key possono essere nulle, potresti avere un problema di modello dei dati.
    A naso, direi che idCliente è una Foreign Key verso la tabella dei clienti, così come idDossier per la tabella dei dossier: come fanno ad essere nulli?

    Alberto Dallagiacoma [MCP, MCTS]

    My Italian Blog | Twitter | LinkedIn
    DotDotNet - User Group .NET Emilia Romagna

    giovedì 11 luglio 2019 16:59
  • Se le due Foreign Key possono essere nulle, potresti avere un problema di modello dei dati.
    A naso, direi che idCliente è una Foreign Key verso la tabella dei clienti, così come idDossier per la tabella dei dossier: come fanno ad essere nulli?

    Alberto Dallagiacoma [MCP, MCTS]

    My Italian Blog | Twitter | LinkedIn
    DotDotNet - User Group .NET Emilia Romagna

    Ciao, concordo con la conclusione di Alberto. NULL è considerato un valore come qualsiasi altro by design. Se vuoi utilizzare il NULL, puoi creare un indice UNIQUE come questo ed evitare duplicati nelle FK.

    CREATE UNIQUE NONCLUSTERED INDEX [idx] ON [dbo].[Autore]([Autore] ASC,[Titolo] ASC)

    ed avere una situazione di questo tipo:


    HTH,

    Cris

    Please Mark This As Answer if it solved your issue or Vote This As Helpful if it helps to solve your issue. Thank you!

    venerdì 12 luglio 2019 07:10
  • La vostra domanda é pienamente lecita non conoscendo l'applicazione.

    La tabella documenti é in comune con diverse funzioni di upload.

    Se un documento viene upldato all'interno di dossier o viene associato ad un utente hanno l'userid e/o iddossier

    questo vuol dire che i due valori attualmente possono essere nulli e non per forza join con altre tabelle

    per esempio se un cliente ha 5 dossier ma deve inviare la foto del suo profilo o la sua carta d'identità sempre dal suo profilo queste saranno inserite nel db con iddossier null

    o per esempio lato admin invio un documento che é associato al dossier ma a nessun utente ha l'id dossier ma non l'id utente (questo per permettere a tutti gli utenti di quel dossier di accedere ad esso)



    http://www.fuossbook.it

    venerdì 12 luglio 2019 09:06
  • Hmmm, se il requisito di business è questo (ed io l'ho capito bene... :-) ), non trovo molto sensato mettere nella stessa tabella idDossier e idUtente, perché viola la 1NF.

    se un documento può essere associato ad un dossier o ad un utente, serviranno due tabelle:

    1. Associazione IDDocumento - IDUtente
    2. Associazione IDDocumento - IDDossier

    In questo modo andrai ad inserire i record nelle tabelle solo se l'associazione è esistente, potrai mettere i vincoli di integrità referenziale e rispettare la 1NF.

    La soluzione di Cristiano è corretta, perché ti permette di creare un indice univoco che ammette anche i valori nulli, evitandoti le duplicazioni, ma il modello relazionale così fatto ti potrebbe dare qualche grattacapo...

    My 2 cents... :-)


    Alberto Dallagiacoma [MCP, MCTS]

    My Italian Blog | Twitter | LinkedIn
    DotDotNet - User Group .NET Emilia Romagna

    venerdì 12 luglio 2019 13:42